【问题标题】:Unable to inject a CDI bean in Primefaces LazyDataModel implementation class无法在 Primefaces LazyDataModel 实现类中注入 CDI bean
【发布时间】:2015-03-12 08:06:48
【问题描述】:

我在org.primefaces.model.LazyDataModel 的实现类中注入的任何CDI bean,结果都是空的。惰性模型实现类本身是一个 CDI @Named bean,作用域为 @javax.faces.bean.ViewScoped。它看起来像这样:

    @Named("myLazyModel")
    @ViewScoped
    Class MyLazyModel extends LazyDataModel implements Serializable {

    public MyLazyModel() {

    }

    @Inject
    AnotherCdiBeanClass injectedObj;

    public AnotherCdiBeanClass getInjectedObj() {
        return injectedObj;
    }

    public AnotherCdiBeanClass setInjectedObj(AnotherCdiBeanClass anotherCdiBeanClassObj) {
        this.injectedObj = anotherCdiBeanClassObj;  
    }


    public void someMethod() {
       getInjectedObj(); // Its NULL, why?
    }


}

在注入lazymodel 实现bean 类时,我确实收到了来自Java 的Eclipse 警告。警告类似于 lazymodel 类 bean 不能被容器代理,因为它不包含非私有的无参数构造函数,并且 bean 不是普通的作用域 bean(类似的东西)。

还有一个问题,在LazyDataModel实现类中,我将rowCount设置为实际数据列表动态大小的大小(在网格中过滤后的大小)。但是在一些 CDI bean 中实例化惰性模型实现类之后,我的 rowCount 为零。

new MyLazyModel(actualDataList).getRowCount() -> 0

经过调试,我发现它确实包含完整的实际数据列表,但 rowCount 仍然为零。

我在输入时需要rowCount 过滤行,并在primefaces 网格上过滤它们,以便我可以使用当前过滤网格的rowCount 值动态更新outputLabel。

int currentRowCount = actualDataListInLazyModelClass.size();

我将像这样更新 outputLabel:

org.primefaces.context.RequestContext.getCurrentInstance.update("myForm:recordCountLabel");

但在此之前,我需要使用 rowCount 值设置注入 bean(View 的支持 bean)的属性,但注入的 bean 本身如前所述变为 null。

getInjectedObj().setNoOfRecords(Integer.toString(currentRowCount));

// NULL POINTER 因为 getInjectedObj() 为空

很抱歉,由于我的限制,我或多或少地描述了一些事情。

【问题讨论】:

  • 这实际上是两个独立的问题。这个话题与真正的原因没有太大关系。下次记住这一点。
  • 据此,我已经更改了问题的标题。

标签: java primefaces cdi jsf-2.2


【解决方案1】:

您的 ViewScoped 有误。对于 JSF 2.2 上的 CDI,它应该是 javax.faces.view.ViewScoped,如果你在 JSF 2.0/2.1 上但正在使用 CDI(你“应该”),你可以使用 OmniFaces Viewscoped

另见

【讨论】:

  • 有问题。在我的项目中使用了 javaee-api-6.0.jar。它不包含类 javax.faces.view.ViewScoped。它是在 Java EE 7 中引入的。真的有任何解决方法吗?
  • 是的,对于 JSF 2.0/2.1,您可以使用 OmniFaces ViewScoped(相应地编辑了我的答案)
  • 但我使用的是 Primefaces 5.0。所以也许我也不能使用 OmniFaces。我对吗?因为我必须使用 JBoss EAP 6.3.2 和 Java EE 6 API。所以,到目前为止,我一直在 EAP 6.3.2 模块中使用 JSF 2.1.28 支持的 java.faces.bean.ViewScoped。
  • 另外,javax.inject.Named 和 javax.faces.bean.ViewScoped 的组合在应用程序的所有其他 CDI bean 中运行良好。但是在 LazyDataModel 实现类中,这种组合不起作用,所有注入的 bean 都是空的。
  • 哦,这样做new MyLazyModel不会导致发生注射...见stackoverflow.com/questions/12368888/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多