我怎样才能注入@FacesConverter?

时间:2012-10-31 11:17:49

标签: jsf java-ee dependency-injection cdi

我写了一个转换器。我正在使用CDI和注入并行。在这种情况下,不会注入类。我怎样才能使注射成为可能?

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}

1 个答案:

答案 0 :(得分:29)

@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,那么你需要通过JNDI手动获取EJB。 this blog article中显示了一个具体的例子。但是,我无法告诉CDI bean。

JSF的人已经证实了这种令人尴尬的疏忽,他们会在即将到来的 JSF 2.2中使@FacesConverter成为合格的注射目标,另见JSF spec issue 763 JSF 2.3。

另见:


更新,如果您碰巧使用JSF实用程序库OmniFaces,或者可以使用它,因为它的版本为1.6,只有/WEB-INF/lib中的OmniFaces JAR,所有您的webapp automatically中的@FacesConverter s(和@FacesValidator s)无需任何额外的努力就有资格获得CDI和EJB注入。