【问题标题】:How can I inject in @FacesConverter? [duplicate]如何注入@FacesConverter? [复制]
【发布时间】:2012-10-20 20:03:50
【问题描述】:

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

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}

【问题讨论】:

标签: jsf jakarta-ee dependency-injection cdi


【解决方案1】:

@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 时,所有 @FacesConverters (和 @FacesValidators)在您的 webapp automatically 中无需任何额外努力即可获得 CDI 和 EJB 注入的资格。

【讨论】:

  • 没有Facesconverter注解的转换器有问题吗?是为了性能还是其他?
  • 没有。它只是改变了管理方式。
  • 它在 BalusC 中按预期工作
  • 您的答案总是干净且有效。
  • @Tiny:它没有被纳入 JSF 2.2。他们在最后一刻将它推迟到 JSF 2.3,因为它有一个意想不到的副作用,在 JSF 2.2 正式发布之前他们无法在短时间内修复。再次,OmniFaces 来救援。
猜你喜欢
  • 2023-04-07
  • 2011-12-01
  • 2021-08-11
  • 2015-07-13
  • 2014-11-16
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多