2012-05-31 13 views
5

Estoy tratando de usar la primavera para proporcionar frijoles administrados a jsf. Supongo que @ManagedBean será recogido por el contenedor JSF para vincular el EL en JSF con el bean administrado, incluso cuando uso el resorte configurando el uso del resorte en faces-config.xml.jsf 2,0 primavera 3 solicitud de alcance no funciona

Spring proporcionará los beans pero ahora ¿quién gestiona el alcance de los beans?

He intentado seguir anotación en beans para que se convierta en alcance de solicitud, pero no funcionan.

@ManagedBean(name="helloBean") //meant for JSF 
@RequestScoped //meant for JSF 
@Scope(value="request") //meant for spring 
@Controller //meant for spring 
public class HelloBean implements Serializable { 

En realidad anterior que estaba usando JSF simple y @ManagedBean y @RequestScoped estaban funcionando bien. Ahora, cuando traté de integrar usando la primavera, el alcance no funciona.

Incluso he intentado configurar bean scope en spring config, pero funcionan como se esperaba en el contexto de la primavera (singleton y prototipo) pero no contexto de solicitud web.

Estaba tratando de evitar tener que usar la anotación anterior @Scope y @Controller esperando que JSF administre el alcance pero no parezca.

A continuación se muestra mi fragmento de archivo para la configuración de primavera y MyHelloBean, que probablemente ayudará a comunicarse mejor.

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" /> 

<bean id="myHelloBean" class="com.mkyong.common.MyHelloBean" init-method="init" > 
     <property name="helloBean" ref="helloBean"></property> 
</bean> 

@ManagedBean 
@RequestScoped 
@Scope(value="request") 
@Controller 
public class MyHelloBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    //@ManagedProperty(value = "#{helloBean}") 
    private HelloBean helloBean; 

ver en el anterior MyHelloBean estoy usando DI primavera para establecer helloBean la que consigue el sistema con una multa de primavera. He comentado @ManagedBean, que creo que puedo dejarlo allí ya que la primavera lo ignorará de todas formas y JSF no lo va a procesar, supongo, pero para estar seguro lo comenté para que JSF no lo procesara.

Para completar utilizo a continuación en faces-config para activar el uso del resorte.

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

Saludos,

Miten.

Respuesta

2

Su enfoque es un poco confuso en el sentido de que parece que está mezclando la configuración de Spring XML y la configuración de Spring Annotation-based. Como se describe como un ejemplo here, si está utilizando la configuración anotada a continuación, usted debe tener:

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

a la orden de Primavera de escaneado para las anotaciones. De lo contrario, si usted está utilizando la configuración de XML, entonces debería haber:

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" /> 

ya que por defecto el scope de un grano de primavera es singleton.

+0

usted toda la razón. Pude agregar el scope = request a spring config y mantener mis beans jsf antiguos con sus anotaciones y funciona como se esperaba. Me confundieron con la anotación y el alcance en el lado de la primavera. Otra respuesta comparte algunas ideas más sobre el alcance y la inyección, pero creo que esta es una migración más simple y fácil hacia la integración de Spring en jsf. Conocía solo dos alcances para los frijoles primavera. ¿Dónde se enumeran estos otros ámbitos? La web de primavera (cargador de contexto) entiende estos nuevos ámbitos y, por lo tanto, tienen sentido en el contexto web de primavera. o son válidos para la primavera central también lo dudo? – Miten

+0

[referencia alcance de primavera de la haba] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes) – nobeh

5

Nuestro equipo enfrentó problemas similares al integrar JSF y los frijoles Spring, incluyendo problemas con sus alcances. Y aquí estoy para compartir nuestro conocimiento.

Scopes

Básicamente ahora, cuando definió en su contexto de aplicación, que primavera será la gestión de sus granos, por lo tanto Scopes. Spring mapeará las anotaciones de alcance de JSF en sus anotaciones de alcance nativas.

  • Ejemplo cuando tanto la primavera y el apoyo JSF proporcionado alcance:

@RequestScoped anotación se asignará a @Scope ("request") de la anotación de la primavera, etc con otros ámbitos compatibles.

  • Ejemplo cuando la primavera no soporta alcance previsto de JSF:

@ViewScoped no se define en las anotaciones de alcance nativas de la primavera, de este modo (no seguro) que utilizará ámbito predeterminado de la primavera, que es singleton, o alcance de la solicitud (no estoy seguro).

grano de inyección

En JSF2 que utilizan @ManagedProperty anotaciones para la inyección, mientras que la primavera utiliza anotación @Autowired. ¿Cuáles son las diferencias y cuáles elegir?

  • La inyección de granos de la primavera con @ManagedProperty:

componente primavera desea inyectar debe tener un valor que coincida con el valor de JSF anotación de inyección: @Component (value = "valueMatches") inyectados con @ ManagedProperty (value = "valueMatches").

  • La inyección de granos de la primavera con @Autowired:

componente de muelle que desea inyectar necesidad no requiere un valor personalizado para distinguir, si se trata de la única aplicación del frijol se está inyectando: @Component inyectado con @Autowired.

Nuestra forma

Utilizamos anotaciones de primavera para la definición de las habas, los alcances y la inyección.

Marcamos beans JSF con @Scope (value = "desiredScope"), @Controller (value = "beanName") y @Qualifier (value = "beanName") anotaciones. Más tarde, que podría ser accedido desde contexto JSF con ayuda de en faces-config.xml través valor "beanName" se define en la anotación @Controller.

Marcamos servicios de primavera con @Service anotación.

inyectamos servicios de resorte y los granos de JSF con la anotación @Autowired.

Encontramos ViewScope y FlashScope implemetations personalizados en la web y los usaron para nuestros frijoles. Por lo tanto, no perdimos ninguno de los ámbitos JSF2 e incluso agregamos uno nuevo.

Espero que esto ayude.

+0

Gracias por la respuesta. Supongo que necesito leer algunas notas relacionadas con Spring Spring (mvc de primavera) para comprender estas nuevas anotaciones, inyectar, servicio, componente, calificador. Prefiero irme sin usarlos y simplemente usar scope = "request" en bean config como lo señala otra respuesta. – Miten

+0

Sí, está perfectamente bien. En nuestro caso, era justo, que necesitábamos ViewScope de JSF, pero nuestra aplicación se basaba en Spring beans, así que esto fue mejor para nosotros. Solo tenga en cuenta los posibles problemas con Spring y JSF2 que se mencionan aquí, especialmente si va a inyectar Spring Components y usar States que son compatibles con JSF, pero no son compatibles con Spring. – JMelnik

+0

@JMelnik ¿puedes compartir tu código de FlashScope? Estoy teniendo dificultades para encontrarlo en línea – Andre

Cuestiones relacionadas