14

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

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}
4

1 回答 1

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。此博客文章中显示了一个具体示例。但是,对于 CDI bean,我不能说。

JSF 人员已经确认了这一令人尴尬的疏忽,他们将@FacesConverter在即将到来的 JSF 2.2 中将其作为合格的注入目标,另请参阅JSF 规范问题 763 JSF 2.3。

也可以看看:


如果您碰巧使用 JSF 实用程序库OmniFaces或愿意使用它,请更新,因为它的 1.6 版,当只有 OmniFaces JAR in 时,您的 webapp 中的/WEB-INF/lib所有@FacesConverters(和s)都会自动符合 CDI 和 EJB 注入的条件,而无需任何额外努力。@FacesValidator

于 2012-10-31T11:26:10.890 回答