将CDI bean注入到JSF @ViewScoped bean中

5

我有一个关于JSF、CDI项目的问题。经过大量研究,我发现在CDI中没有@ViewedScoped注释。我用基于ajax的页面与对话框解决了这个问题。我想从数据表格传递变量到对话框。为此,我不能使用@RequestedScopedbean,因为该值在请求结束后被丢弃。有人可以帮我解决吗?我不能使用@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。不要不必要地考虑将它们混合使用。 - Tiny
1
我做了很多研究,发现在CDI中没有@ViewedScoped注解。但这只是在Java EE 7之前的情况。Java EE 7(JSF 2.2)透明地支持与JSF视图范围(来自javax.faces.bean.ViewScoped)兼容的视图范围(来自javax.faces.view.ViewScoped)。 - Tiny
1个回答

15

首先,如果你想使用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 beans,您可以使用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
@Milkmaid,请查看展示,我认为这可能会对您有所帮助:http://showcase.omnifaces.org/cdi/ViewScoped - Tarik
OmniFaces说我没有CDI。但是我在依赖项中使用了Weld实现。因为我使用Tomcat,所以我需要应用服务器吗? - Milkmaid
是的,它一直在那里。 - Milkmaid
4
在JavaEE7容器中,beans.xml文件并非必需,因为CDI在EE7中默认处于活动状态。 - NBW
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接