在@FacesComponent中@Inject-ed值为null

时间:2013-10-07 11:10:28

标签: jsf java-ee cdi uicomponents

我的印象是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 */
    }
}

3 个答案:

答案 0 :(得分:13)

不幸的是,即使对于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@Inject按照您的方式@Named @Stateful注释旅游课程register your component in faces-config.xml。由于UI组件实例是通过JSF Application#createComponent()创建的,而不是通过CDI创建的,因此您也需要一个自定义的应用程序实现(就像OmniFaces对那些转换器/验证器一样)。
  3. 顺便说一下,你有两个问题就是你到目前为止所得到的:(1){{1}}当前者来自CDI世界而后者来自EJB时是什么意思世界和(2)你确定你打算在每个请求基本上重新创建的面部组件中保持状态吗?

答案 1 :(得分:1)

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

答案 2 :(得分:0)

通过复合组件属性将值从XHTML页面传递给我们。