working test not autowire attribute spring validation jsf-2 dependency-injection service-layer

spring - test - Cómo inyectar en @FacesValidator con @EJB, @PersistenceContext, @Inject, @Autowired



spring autowire null (1)

¿Cómo puedo inyectar una dependencia como @EJB , @PersistenceContext , @Inject , @AutoWired , etc. en @FacesValidator ? En mi caso específico, necesito inyectar un bean gestionado Spring a través de @AutoWired :

@FacesValidator("emailExistValidator") public class EmailExistValidator implements Validator { @Autowired private UserDao userDao; // ... }

Sin embargo, no se inyectó y permanece null , lo que da como resultado java.lang.NullPointerException . Parece que @EJB , @PersistenceContext y @Inject tampoco funcionan.

¿Cómo puedo inyectar una dependencia de servicio en mi validador para poder acceder al DB?


@FacesValidator no está administrado por el contenedor de inyección. Debes convertirlo en un frijol administrado. Utilice el @Component de Spring, @Named de CDI o @FacesValidator de @FacesValidator en lugar de @FacesValidator para convertirlo en un bean administrado y, por lo tanto, elegible para la inyección de dependencia.

Por ejemplo, suponiendo que desea utilizar @ManagedBean de JSF:

@ManagedBean @RequestScoped public class EmailExistValidator implements Validator { // ... }

También necesita referenciarlo como un bean administrado por #{name} en EL en lugar de como un ID de validador en una cadena codificada. Por lo tanto, entonces

<h:inputText ... validator="#{emailExistValidator.validate}" />

o

<f:validator binding="#{emailExistValidator}" />

en lugar de

<h:inputText ... validator="emailExistValidator" />

o

<f:validator validatorId="emailExistValidator" />

Esto es realmente incómodo. Los chicos de JSF han confirmado esta vergonzosa supervisión y harán que @FacesValidator (y @FacesConverter ) sea un objetivo de inyección elegible en el próximo JSF 2.2 2.3, ver también el número de especificación JSF 763 . Para los EJB hay una solución al tomarla manualmente de JNDI, ver también Cómo obtener un @EJB en @FacesConverter y @FacesValidator . Si usa la extensión CDI MyFaces CODI , también puede resolverla colocando @Advanced annotation en la clase.

Ver también:

Actualización : si utiliza la biblioteca de utilidades JSF OmniFaces , desde la versión 1.6 se agrega compatibilidad transparente para usar @Inject y @EJB en una clase @FacesValidator sin ninguna configuración adicional o anotaciones. Consulte también el ejemplo de presentación de CDI @FacesValidator .