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
.