我怎样才能注入@FacesConverter?

Kay*_*ser 14 jsf dependency-injection java-ee cdi

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

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 29

@FacesConverter不是合格的注射目标.用@ManagedBean或替换它@Named.如您也想使用CDI,请使用@Named.

@Named
@ApplicationScoped // I assume that your converter doesn't have any state.
public class MyConverter implements Converter {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

您只需要更改视图中引用的方式.你不能再依赖forClass了.您需要将其明确指定为#{myConverter}.

<h:inputSomething ... converter="#{myConverter}" />
Run Code Online (Sandbox Code Playgroud)

要么

<h:inputSomething ...>
    <f:converter binding="#{myConverter}" />
</h:inputSomething>
Run Code Online (Sandbox Code Playgroud)

如果你真的需要保持@FacesConverter支持forClass,那么你需要通过JNDI手动获取EJB.本博客文章中显示了一个具体示例.但是我不能告诉CDI bean.

JSF人员证实了这种令人尴尬的疏忽,他们将@FacesConverter在即将到来的JSF 2.2中成为符合条件的注入目标,另请参阅JSF规范问题763 JSF 2.3.

也可以看看:


更新如果您碰巧使用JSF实用程序库OmniFaces,或者可以使用它,因为它的版本1.6,当只有OmniFaces JAR时/WEB-INF/lib,您的webapp中的所有@FacesConverters(和@FacesValidators)自动成为CDI和EJB注入的资格而没有任何额外的努力.

  • @Tiny:它没有进入JSF 2.2.他们在最后一刻将它推迟到JSF 2.3,因为它有一个意想不到的副作用,他们无法在官方JSF 2.2发布之前的短时间内解决.再次,OmniFaces来救援. (2认同)