【问题标题】:@Inject-ed value null in @FacesComponent@FacesComponent 中的 @Inject 值 null
【发布时间】:2013-10-13 22:26:47
【问题描述】:

我的印象是 CDI 不适用于具有 @javax.faces.component.FacesComponent 的类。这是真的?

这是我的示例,它不起作用。 MyInjectableClass 用在代码中其他注入不成问题的地方,所以我认为一定是关于@FacesComponent 注释。

我要注入的类:

@Named
@Stateful
public class MyInjectableClass implements Serializable {

    private static final long serialVersionUID = 4556482219775071397L;
}

使用该类的组件;

@FacesComponent(value = "mycomponents.mytag")
public class MyComponent extends UIComponentBase implements Serializable {

    private static final long serialVersionUID = -5656806814384095309L;

    @Inject
    protected MyInjectableClass injectedInstance;


    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        /* injectedInstance is null here */
    }
}

【问题讨论】:

    标签: jsf jakarta-ee cdi uicomponents


    【解决方案1】:

    不幸的是,即使对于 JSF 2.2,@FacesComponent@FacesValidator@FacesConverter 也不是有效的注入目标(请阅读 Arjan Tijms 的 What's new in JSF 2.2? 了解更多详细信息)。正如 Arjan 指出的那样:

    不过,JSF 2.3 可能会考虑这些因素。

    你现在能做什么?好吧,您基本上有两种选择:

    1. 处理CDI injection via lookup,或切换到EJB并执行simpler EJB lookup
    2. @Named 代替@FacesComponent@Injectregister your component in faces-config.xml 组件注释游览类。由于 UI 组件实例是通过 JSF Application#createComponent() 创建的,而不是通过 CDI 创建的,因此您还需要自定义应用程序实现(就像 OmniFaces 对那些转换器/验证器一样)。

    顺便说一下,到目前为止,您有两个问题:(1)@Named @Stateful 是什么意思,前者来自 CDI 世界,后者来自 EJB 世界, (2) 你确定你打算将状态保存在一个基本上每次请求都会重新创建的 faces 组件中吗?

    【讨论】:

    • 你真的测试了#2吗? UI 组件实例是通过 JSF Application#createComponent() 创建的,而不是通过 CDI。所以你基本上也需要一个自定义的Application 实现(就像 OmniFaces 对那些转换器/验证器一样)。
    【解决方案2】:

    @FacesCompnent 由 JSF 管理,不支持注入。

    【讨论】:

      【解决方案3】:

      通过复合组件属性从 XHTML 页面传递值对我们有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 2014-01-23
        • 2020-05-24
        • 1970-01-01
        相关资源
        最近更新 更多