我的印象是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 */
}
}
答案 0 :(得分:13)
不幸的是,即使对于JSF 2.2 @FacesComponent
,@FacesValidator
和@FacesConverter
也不是有效的注入目标(有关详细信息,请参阅Arjan Tijms的What's new in JSF 2.2?)。正如Arjan指出的那样:
尽管如此,JSF 2.3可能会考虑这些因素。
你现在可以做些什么?好吧,你基本上有两个选择:
@Named
而不是@FacesComponent
,@Inject
按照您的方式@Named @Stateful
注释旅游课程register your component in faces-config.xml。由于UI组件实例是通过JSF Application#createComponent()创建的,而不是通过CDI创建的,因此您也需要一个自定义的应用程序实现(就像OmniFaces对那些转换器/验证器一样)。顺便说一下,你有两个问题就是你到目前为止所得到的:(1){{1}}当前者来自CDI世界而后者来自EJB时是什么意思世界和(2)你确定你打算在每个请求基本上重新创建的面部组件中保持状态吗?
答案 1 :(得分:1)
@FacesCompnent
由JSF管理,不支持注入。
答案 2 :(得分:0)
通过复合组件属性将值从XHTML页面传递给我们。