在@FacesComponent中@Inject-ed值为null

bob*_*bel 3 jsf uicomponents java-ee cdi

我的印象是CDI没有使用具有@javax.faces.component.FacesComponent.的类.这是真的?

这是我的例子,这不起作用.将MyInjectableClass用于在在注射是没有问题的代码等穴位,所以它必须是有关@FacesComponent注释,我认为.

我要注入的课程:

@Named
@Stateful
public class MyInjectableClass implements Serializable {

    private static final long serialVersionUID = 4556482219775071397L;
}
Run Code Online (Sandbox Code Playgroud)

使用该类的组件;

@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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

sku*_*sel 13

不幸的是,即使是JSF 2.2 @FacesComponent,@FacesValidator@FacesConverter不是有效的注入目标(读在JSF 2.2有什么新鲜事?了解更多详情由阿尔扬Tijms).正如Arjan指出:

尽管如此,JSF 2.3可能会考虑这些因素.

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

  1. 通过查找处理CDI注入,或切换到EJB并执行更简单的EJB查找 ;
  2. 注释旅游类@Named代替@FacesComponent,@Inject该组件你的方式和faces-config.xml中注册您的组件.由于UI组件实例是通过JSF Application#createComponent()创建的,而不是通过CDI创建的,因此您也需要一个自定义的应用程序实现(就像OmniFaces对那些转换器/验证器一样).

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

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