【问题标题】:Inject CDI bean into JSF @ViewScoped bean将 CDI bean 注入 JSF @ViewScoped bean
【发布时间】:2015-04-15 12:10:33
【问题描述】:

我对 JSF、CDI 项目有疑问。我做了很多研究,发现在 CDI 中没有 @ViewedScoped 注释。我用对话框解决了基于 ajax 的页面的问题。我想将变量从数据表传递给对话框。为此,我不能使用@RequestedScoped bean,因为在请求结束后值被丢弃。谁能帮我解决它?我不能使用@SessionScoped,但恕我直言,这是一种不好的做法。或者也许只将这一个变量保存到知道的会话中。你们能给我一些提示如何优雅地解决这个问题吗?

import javax.enterprise.context.ApplicationScoped;    
@ApplicationScoped
public class ServiceBean implements Serializable {
...
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class SomeBean {

@Inject
ServiceBean serviceBean;


@Postconstruct ...

这是错误信息:

com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean warDetailBean

【问题讨论】:

  • 使用 CDI bean 或 JSF bean。不要不必要地考虑混合它们,
  • "我做了很多研究,发现在 CDI 中没有 @ViewedScoped 注释。" 这仅在 Java EE 7 之前是正确的。Java EE 7 (JSF 2.2) 透明地支持 JSF 视图范围(来自 javax.faces.bean.ViewScoped)的兼容视图范围(来自 javax.faces.view.ViewScoped)。

标签: jsf jsf-2 cdi view-scope


【解决方案1】:

首先,如果您尝试使用 CDI,您需要通过在您的应用程序中放置一个WEB-INF/beans.xml 文件来激活它(注意此文件可以为空),有关该文件的更多信息可以在Weld - JSR-299 Reference Implementation找到。

当您使用Tomcat时,请务必按照How to install CDI in Tomcat?中的步骤遵守所有配置要求

第二,即使您可以在 JSF 托管 bean 中使用 @Inject,最好不要将 JSF 托管 bean 和 CDI 混合使用,请参阅 BalusC 关于Viewscoped JSF and CDI bean 的详细回答。

因此,如果您只想使用 CDI @Named bean,则可以使用 OmniFaces 自己的 CDI 兼容 @ViewScoped

import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class SomeBean implements Serializable {

    @Inject
    ServiceBean serviceBean;
}

或者,如果您只想使用 JSF 托管 bean,您可以使用 @ManagedProperty 注入属性:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class SomeBean{

@ManagedProperty(value = "#{serviceBean}")
ServiceBean serviceBean;

}

另见:

【讨论】:

  • 我会给 OmniFaces 一个机会,因为当我向它添加依赖项时,它会产生错误。 CDI 设置正确,一切正常。我只需要@ViewScoped bean。因为我在页面上有很多 ajax。
  • @Milkmaid 请查看我认为可能对您有帮助的展示柜:showcase.omnifaces.org/cdi/ViewScoped
  • OmniFaces 说我没有 CDI。但我依赖于焊接实现。我需要应用程序服务器,因为我使用的是 Tomcat
  • 您是否将 WEB-INF/beans.xml 文件添加到您的应用程序中?
  • 在 JavaEE7 容器中,beans.xml 文件不是必需的,因为 CDI 在 EE7 中默认处于活动状态