Ответ 1
@FacesConverter
не является подходящей целью инъекции. Замените его на @ManagedBean
или @Named
. Поскольку вы также хотели бы использовать CDI, используйте @Named
.
@Named
@ApplicationScoped // I assume that your converter doesn't have any state.
public class MyConverter implements Converter {
// ...
}
Вам нужно только изменить способ обращения к ним в представлениях. Вы больше не можете полагаться на forClass
. Вам нужно явно указать его как #{myConverter}
.
<h:inputSomething ... converter="#{myConverter}" />
или
<h:inputSomething ...>
<f:converter binding="#{myConverter}" />
</h:inputSomething>
Если вам действительно нужно сохранить @FacesConverter
в пользу forClass
, то вам нужно будет захватить EJB вручную JNDI. Конкретный пример показан в в этой статье в блоге. Однако я не могу сказать, что для CDI beans.
Ребята из JSF подтвердили этот смущающий надзор, и они сделают @FacesConverter
подходящую цель для инъекций в предстоящем JSF 2.2, см. также JSF spec issue 763 JSF 2.3.
См. также:
Обновить, если вы используете библиотеку служебных программ JSF OmniFaces или открыты для ее использования, начиная с версии 1.6, когда у вас есть OmniFaces JAR в /WEB-INF/lib
, все @FacesConverter
(и @FacesValidator
s) в вашем webapp автоматически становятся доступными для инъекций CDI и EJB без каких-либо дополнительных усилий.