7

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

4

3 回答 3

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;
}

我想知道是否有人有更好的解决方案。

于 2011-08-23T21:44:00.397 回答
2

我不知道它是否也适用于组件,但是使用 CDI + MyFaces CODI 你有@Advanced 来标记例如应该能够使用@Inject 的 Phase-Listeners。如果它不起作用,您可以在他们的 JIRA 中创建一个功能请求。它们非常快,并且经常发布。

或者你使用: MyBean myBean = BeanManagerProvider.getInstance().getContextualReference(MyBean.class); 手动。

于 2011-08-23T23:49:52.463 回答
2

有没有办法在没有变通方法的情况下完成这项工作?

是的,只需按照通常的方式使用支持 bean。

<x:someComponent value="#{someBean.someProperty}" />

如有必要,将其包装在可重复使用的标记文件/复合材料中以保持干燥:

<my:someComponent />
于 2013-06-04T12:50:19.640 回答