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 .