将 CDI bean 注入 JSF @ViewScoped bean

Inject CDI bean into JSF @ViewScoped bean

我对 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,您需要通过在您的应用程序中放置一个 WEB-INF/beans.xml 文件来激活它(注意该文件可以为空),有关该文件的更多信息可以在 Weld - JSR-299 Reference Implementation.

中找到

当您使用 Tomcat 时,请务必按照 How to install CDI in Tomcat?

中的步骤遵守所有配置要求

其次,即使您可以在 JSF 托管 bean 中使用 @Inject,最好不要混合使用 JSF 托管 bean 和 CDI,请参阅 BalusC's关于 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;

}

另请参阅: