将资源注入UIComponent(又称CDI在这里工作吗?)

时间:2011-08-23 20:30:30

标签: jsf-2 cdi composite-component

我正在编写一个需要与我的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。有关如何获取资源的任何建议吗?

3 个答案:

答案 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 />