2012-01-19 20 views
14

me gustaría utilizar las anotaciones JSF y algunas de primavera anotaciones para inyectar un grano de primavera/servicio en un grano de JSF administrados. (en el jan de jsf solo quiero usar las anotaciones jsf) No quiero usar anotaciones como @named/@inject.JSF 2 inyecte primavera frijol/servicio con @ManagedProperty y sin xml

He intentado encontrar una solución en la red pero sin suerte.

Ejemplo

@ManagedBean 
@ViewScoped 
public class MyBean { 

    @ManagedProperty(value = "#{mySpringBean}") 
    private MySpringBean mySpringBean; 

    public void setMySpringBean(MySpringBean mySpringBean) { 
     this.mySpringBean = mySpringBean; 
    } 

    public void doSomething() { 
    //do something with mySpringBean 
    } 
} 

es algo como esto posible sin el uso de XML. Por ejemplo, no me gustaría usar algo como

FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean"); 

o en faces-config.xml

<managed-bean> 
    <managed-bean-name>myBean</managed-bean-name> 
    <managed-bean-class>com.mytest.MyBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>mySpringBean</property-name> 
     <value>#{mySpringBean}</value> 
    </managed-property> 
</managed-bean> 

es algo así como lo anterior es posible con anotaciones y sin la definición de todos los granos jsf/propiedades y la primavera beans/propiedades para cada bean en los archivos config xml?

+0

Es curioso, yo utilizar este método de inyección y funciona para mí, pero entonces yo también incluir la inyección propiedad en mi 'applicationContext.xml' también. El Spring EL resolver no parece funcionar con beans ViewScoped que he notado. Intente cambiar esto a SessionScoped y vea si la propiedad se inyecta. –

+0

Quiero evitar el applicationContext.xml (soy un poco obstinado, gracias) Pero gracias :) – Dimman

Respuesta

14

Si ya dispone de contenedores de Primavera por qué no utilizar su anotación @Autowired. Para eso, actualice su faces-config.xml según lo sugerido por Boni. A continuación, añadir estos oyentes a su web.xml después de este

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

A continuación, añadir de inmediato a su applicationContext.xml

<context:component-scan base-package="com.examples" /> 

Ahora puede utilizar las anotaciones de la primavera y el bean será algo como esto:

package com.examples; 
@Component 
@Scope(value="request") 
public class MyBean { 
    @Autowired 
    private MySpringBeanClass mySpringBean; 
} 

anotar sus MySpringBeanClass con @Service

Ver también:

+1

y si desea utilizar ViewScope en la primavera tiene que escribir una costumbre ViewScope clase que implementa Alcance. Siga esta entrada del blog para ese [enlace] (http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/) – Ravi

11

poner este código en sus faces-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
    <application> 
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
</faces-config> 

Luego, en su llamada ManageBean Constructor;

WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()); 
mySpringBean = ctx.getBean(MySpringBean.class); 

MySpringBean significa que su beans Spring Clase

+0

He hecho esto pero pero mi bean inyectado siempre es nulo. – Dimman

+0

¿Se puede hacer con anotaciones en el botón de resorte y sin insertar esto en applicationContext.xml? Gracias – Dimman

+1

i tienen que trabajar con la solución WebApplicationContext CTX. Me preguntaba si podía evitarlo y utilizar @ManagedProperty (value = "# {} mySpringBean") directa :) – Dimman

3

Suponiendo que ha configurado correctamente la primavera en web.xml y applicationContext.xml. Hacer la siguiente entrada en faces-config.xml

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

Su código de ejemplo dado anteriormente parece estar bien. Lo que sucederá con la entrada anterior es Managed Property se buscará primero en los beans administrados por JSF, si no se encuentra, se buscará en beans administrados por Spring. Su bean de primavera debe tener las anotaciones adecuadas marcadas y el nombre dado en @ManagedProperty debe coincidir con el nombre predeterminado dado a bean.

Como mencionados por @Boni que no se requiere que se inyecta auto. He usado ajustes como lo deseas.

Una nota al margen: Puesto que usted está optando por la vista alcance favor echar un vistazo a este enlace The benefits and pitfalls of @ViewScoped

Cuestiones relacionadas