将CDI bean注入JSF @ViewScoped bean

时间:2015-02-14 14:46:30

标签: jsf jsf-2 cdi view-scope

我的JSF,CDI项目有问题。我做了很多研究,发现在CDI中没有@ViewedScoped注释。我用对话框解决了基于ajax的页面的问题。我想从datatable传递变量到对话框。为此,我不能使用@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

1 个答案:

答案 0 :(得分:13)

首先,如果您尝试使用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;

}

另见: