CDI注入到FacesConverter中

从几个search,这似乎是一个问题已经存在了一段时间。 我写了一个如下所示的FacesConverter。 对象Category是一个JPA实体,而CategoryControl是提取它的DAO。

@FacesConverter(value = "categoryConverter") public class CategoryConverter implements Converter { @Inject private CategoryControl cc; public CategoryConverter() { } @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { if (cc != null) return cc.getByName(value); System.out.println("CategoryConverter().getAsObject(): no injection!"); return null; } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (!(value instanceof Category)) return null; return ((Category) value).getName(); } } 

正如你现在可能猜到的,我从来没有注射过。 我从这个页面得到了这个解决方法,看起来像这样:

 Workaround for this problem: create this method in your localeController: public Converter getConverter() { return FacesContext.getCurrentInstance().getApplication().createConverter("localeConverter"); } and use converter="#{localeController.converter}" in your h:selectOneMenu. 

不过,我也不能做这个工作。 我的支持bean创build并返回一个转换器好,但它没有得到注入的对象。

我正在使用MyFaces CODI 1.0.1。 使用当前的GlassFish / Weld容器。 任何人都可以提出一个解决scheme之前,我重新编码不使用转换器?

更换

 @FacesConverter(value = "categoryConverter") 

通过

 @Named 

并使用

 <h:inputSomething converter="#{categoryConverter}" /> 

要么

 <f:converter binding="#{categoryConverter}" /> 

代替

 <h:inputSomething converter="categoryConverter" /> 

要么

 <f:converter converterId="categoryConverter" /> 

顺便说一句,在@FacesConverter存在类似的问题。 然而,它提供了一种手动被JNDI抓取的方法。 另请参见JSF 2.0中的通信 – 在@FacesConverter和@FacesValidator中获取EJB 。 这样,您可以使用@FacesConverter(forClass=Category.class)而无需每次手动定义它。 不幸的是,我不能从头到尾如何认识到CDI豆。


更新 :如果碰巧使用JSF实用程序库OmniFaces ,从版本1.6 开始 ,在@FacesConverter类中使用@Inject@EJB透明支持不需要任何额外的configuration或注释。 另请参阅CDI @FacesConverter展示示例 。

@Inject注释仅适用于CDIpipe理的实例。 如果要在非CDI托pipe实例内使用CDIfunction(如JSFvalidation程序或JSF转换程序),则可以对CDI API进行编程。

这只适用于至lessJava EE 7 + CDI 1.1服务器。

 @FacesValidator("userNameValidator") public class UserNameValidator implements Validator { private UserService userService; public UserNameValidator(){ this.userService = CDI.current().select(UserService.class).get(); } @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { .... } } 

https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html

Java EE中的所有AnnotationHell都会忘记如何编写代码。

只需使用@Advanced的CODI为@FacesConverter查看Wiki 。

只要转换器或validation器用@Advanced注释,就可以使用@Inject。

Per BalusC 在这里的答案,我决定添加JSF(requestscoped)托pipe的bean,只包含@FacesConverter和转换器来解决我的应用程序中的这个问题,因为我从JSF托pipe的bean迁移到CDI托pipe的bean。

我对@FacesConverter尝试了CODI @Advanced,但是根本不注入这个bean。