jsf - getasstring - ¿Cómo puedo inyectar en @FacesConverter?
h selectonemenu converter (1)
Esta pregunta ya tiene una respuesta aquí:
Escribí un convertidor. Estoy usando CDI y inyección en paralelo. En ese caso, las clases no se inyectan. ¿Cómo puedo hacer la inyección posible?
@FacesConverter(forClass = MyClass.class)
public class MyConverter implements Converter{
@EJB
private ClassForEJB classForEJB;
@Inject
private ClassForInject classForInject;
// Converter Methods
}
El @FacesConverter
no es un objetivo de inyección elegible. Reemplácelo por @ManagedBean
o @Named
. Como también le gustaría usar CDI, use @Named
.
@Named
@ApplicationScoped // I assume that your converter doesn''t have any state.
public class MyConverter implements Converter {
// ...
}
Solo necesita cambiar la forma en que se ha referenciado en las vistas. Ya no puedes confiar en forClass
. #{myConverter}
especificarlo explícitamente como #{myConverter}
.
<h:inputSomething ... converter="#{myConverter}" />
o
<h:inputSomething ...>
<f:converter binding="#{myConverter}" />
</h:inputSomething>
Si realmente necesitas mantener el @FacesConverter
a favor de forClass
, entonces necesitarías tomar el EJB manualmente por JNDI. Un ejemplo concreto se muestra en este artículo de blog . Sin embargo, no puedo decir eso para los frijoles CDI.
Los chicos de JSF han confirmado esta vergonzosa supervisión y harán que @FacesConverter
un objetivo de inyección elegible en el próximo JSF 2.2, ver también JSF spec issue 763 JSF 2.3.
Ver también:
Actualice si utiliza la biblioteca de utilidades JSF OmniFaces , o si está abierto a usarla, ya que su versión 1.6, al tener OmniFaces JAR en /WEB-INF/lib
, todos los @FacesConverter
(y @FacesValidator
s) en su aplicación web automáticamente ser elegible para la inyección de CDI y EJB sin ningún esfuerzo adicional.