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。