我的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
答案 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;
}