仅通过几次搜索,这似乎已经存在了一段时间。我写了一个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/

10-11 02:27