2011-02-21 13 views
7

Estoy tratando de @javax.naming.Inject un Spring 3 Bean llamado WtvrBean en un JSF 2 @FacesConverter.Cómo inyectar un Bean Spring 3 en un convertidor JSF 2

Tanto el Bean como el convertidor están en el mismo paquete. Y, en applicationContext.xml de mi primavera, estoy escaneando este paquete:

<context:component-scan base-package="my-package" /> 

Pero esto no está funcionando. Por supuesto, la clase interna JSF 2 que usa el convertidor es definitivamente no en my-package.

Por ejemplo, si se quita la @ManagedBean de una JSF 2 ManagedBean, y reemplazar a @org.springframework.stereotype.Component o @Controller, la WtvrBean puede ser @Inject ed en este ManagedBean, mediante el uso del resorte WebFlow.

Bueno, hasta donde yo sé, no existe el estereotipo @Converter en Spring.

Sé que puedo utilizar

FacesContextUtils.getWebApplicationContext(context).getBean("WtvrBean") 

Pero, con este enfoque, el acoplamiento entre la aplicación web y el resorte es cada vez más estrecho. (las anotaciones son metadatos, y algunos autores ni siquiera las consideran dependientes).

Estoy usando FacesContextUtils hasta ahora, si no hay una solución mejor.

¿Alguna idea?

Respuesta

12

Si desea inyectar beans en instancias de una clase, estas instancias tienen que ser administradas por resorte. Es decir. la primavera tiene que crear instancias de ellos. Y esto no está sucediendo, entonces, no, no puedes inyectar allí.

Pero esto se debe a que registra el convertidor dentro de jsf. Puede omitir que:

@Component("myConverter") 
public class MyConverter implements Converter { .. } 

Y luego, si está utilizando la primavera <el-resolver>:

converter="#{myConverter}" 

Así que lo hará. Esto ha funcionado para mí.

(Una solución vale la pena mencionar es que puede hacerlo mediante el uso de aspectj weaving and @Configurable, pero prefiero el enfoque FacesContextUtils. El tejido modifica clases para que sean gestionados de Spring incluso si no se crean instancias de la primavera.)

+0

Hola. No quiero que mi convertidor sea elegible para inyección. Hay un Bean llamado WtvrBean, y quiero que el bean se inyecte en el convertidor. Echaré un vistazo a aspectj. – bluefoot

+0

@bluefoot lo siento, eso es lo que quise decir - no es posible inyectar otros frijoles en él. – Bozho

+0

@bluefoot - uy, olvidé que realmente había hecho esto ... ver mi actualización – Bozho

-1

Agregue la anotación @Scope (por ejemplo, con el parámetro "solicitud") a su bean administrado.

@ManagedBean 
@Scope("request") 
public class MyBean { 
.... 
} 
+0

que no era lo que pedí. My Managed Bean está bien, al igual que escribí. El problema está en el convertidor. – bluefoot

2
@FacesConverter(value = "examTypeConverter") 
@Named 

Respuesta simple.

+1

Un enorme -1: OP usa Spring, no CDI. El '@ Named' es específico de CDI, no de Spring. El modo Spring es, como lo ha respondido Bozho, el uso de '@ Component', que en realidad es esencialmente el mismo que dijiste. Quien haya votado esta respuesta tiene que reconsiderar su voto favorable. – BalusC

+0

Spring 3 admite la inyección '@ Named', aunque no está llamando al contenedor CDI para inyectar el bean/resource. –

0

hey estaba enfrentando el mismo problema que los granos de primavera no se están inyectando en el convertidor JSF.

y luego buscando en Google al respecto encontré las respuestas que después de JSF 2.2 podemos hacer conversores como jsf managed bean. y luego podemos inyectar la dependencia de primavera. resolvió mi problema.

@ManagedBean 
@RequestScoped 
public class CustomerByName implements Converter { 

     @ManagedProperty(value = "#{customerDao}") 
     private CustomerDao customerDao; 

y en su página JSF usarlo como un bean gestionado

converter="#{customerByName}" 
Cuestiones relacionadas