5

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

3 回答 3

14

不幸的是,即使对于 JSF 2.2 @FacesComponent@FacesValidator也不@FacesConverter是有效的注入目标(有关更多详细信息,请阅读 Arjan Tijms 的JSF 2.2 中的新功能? )。正如 Arjan 指出的那样:

不过,JSF 2.3 可能会考虑这些内容。

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

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

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

于 2013-10-07T11:47:01.433 回答
1

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

于 2013-10-07T11:32:06.987 回答
0

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

于 2018-09-01T20:03:23.560 回答