我正在编写一个需要与我的DAO交互的(复合)组件。以下是声明Java部分的方式:
@FacesComponent(value="selectLocation")
public class SelectLocation extends UINamingContainer {
要获取DAO对象,我尝试了CDI注释:
@Inject private LocationControl lc;
这没用,所以我尝试了Faces注释:
@ManagedProperty (value = "@{locationControl}") private LocationControl lc;
两种情况都没有发生 - 属性lc在构造函数完成后最终为null。
我在所有支持bean中使用CDI,一切正常。这将使用GlassFish 3.1.1中的Weld。有关如何获取资源的任何建议吗?
答案 0 :(得分:5)
我现在有一个解决办法,就是基本上放入CDI等的锅炉板代码。人。应该废除。我现在有这个方法:
public LocationControl getLocationControl() {
if (lc != null) return lc;
FacesContext fc = getFacesContext();
Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class);
if (obj instanceof LocationControl) lc = (LocationControl) obj;
return lc;
}
我想知道是否有人有更好的解决方案。
答案 1 :(得分:2)
我不知道它是否适用于组件,但是使用CDI + MyFaces CODI,您可以使用@Advanced标记,例如阶段监听器应该能够使用@Inject。如果它不起作用,您可以在其JIRA中创建功能请求。它们非常快,而且频繁发布。
或者您使用: MyBean myBean = BeanManagerProvider.getInstance()。getContextualReference(MyBean.class); 手动
答案 2 :(得分:2)
有一种方法可以在没有解决方法的情况下完成这项工作吗?
是的,只需按常规方式使用支持bean。
<x:someComponent value="#{someBean.someProperty}" />
如果需要,在可重复使用的标记文件/复合中包装,以使其保持干燥状态:
<my:someComponent />