仅通过几次搜索,这似乎已经存在了一段时间。我写了一个FacesConverter,如下所示。对象类别是JPA实体,而类别控件是获取它的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();
}
}
正如您现在可能猜到的那样,我从未得到过注入(inject)。我从this page获得了这种解决方法,它看起来像这样:
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会创建并返回一个转换器,但是它没有将对象注入(inject)其中。
我正在使用MyFaces CODI 1.0.1。使用当前的GlassFish / Weld容器。在我重新编码为不使用Converter之前,有人可以提出解决方案吗?
最佳答案
更换
@FacesConverter(value = "categoryConverter")
通过
@Named
和使用
<h:inputSomething converter="#{categoryConverter}" />
要么
<f:converter binding="#{categoryConverter}" />
代替
<h:inputSomething converter="categoryConverter" />
要么
<f:converter converterId="categoryConverter" />
顺便说一下,
@EJB
内部的@FacesConverter
存在类似的问题。但是,它提供了JNDI手动抓取的方法。另请参见Communication in JSF 2.0 - Getting an EJB in @FacesConverter and @FacesValidator。这样,您可以使用@FacesConverter(forClass=Category.class)
,而无需每次都手动定义它。不幸的是,我无法从头顶上知道如何实现CDI bean。更新:如果您碰巧使用了JSF实用程序库OmniFaces,则由于1.6版为透明添加了对
@Inject
类中使用@EJB
和@FacesConverter
的支持,而没有任何其他配置或注释。另请参见the CDI @FacesConverter
showcase example。关于jsf-2 - 将CDI注入(inject)FacesConverter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7531449/