This question already has answers here:
How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?

(5个答案)


4年前关闭。





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

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}

最佳答案

@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团队已经证实了这种令人尴尬的监督,他们将使@FacesConverter在即将发布的JSF 2.2中成为合格的注入目标,另请参见JSF spec issue 763 JSF 2.3。
也可以看看:

How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?


如果您刚巧使用JSF实用程序库OmniFaces,或者对它开放使用,请进行更新,从1.6版开始,当/WEB-INF/lib中只有OmniFaces JAR时,Web应用程序中的所有@FacesConverter(和@FacesValidatorautomatically无需任何额外的努力就可以进行CDI和EJB注入。

关于jsf - 如何注入(inject)@FacesConverter? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13156671/

10-10 22:44