在CDI焊接中查看范围

Bal*_*123 11 scope cdi jboss-weld

我想@ViewScoped在我的应用程序中使用- scope作为某些网页的支持bean.我还使用CDI将依赖注入到后台bean中.

但是,当我使用这样注释的支持bean时

@ManagedBean
@ViewScoped

@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

@Inject注释将不注入任何东西,我得到了NullPointerException,只要我正在访问的依赖.

但是,当我装饰支持bean时

@Named
@ViewScoped


@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

注射工作正常,但现在@ViewScoped被忽略,因为它不是CDI/Weld的一部分.

我如何@ViewScoped与CDI Weld一起使用?

小智 12

问题是您将简单的托管bean与CDI托管bean混合在一起并且它们不能一起工作.Managed Beans是一个用于定义bean及其注入bean的简单框架.CDI是一个独立的野兽,具有各种额外的好处.

但是,托管bean不能使用CDI注入点,但可以使用ViewScope,而CDI bean使用CDI注入点和所有好东西,但ViewScope不可用.

要解决此问题,您必须使用CDI并使用Seam-Faces库来使用视图范围,或者放弃CDI并坚持使用简单的托管bean,这是一个简单的实现.

干杯,

安迪


Dis*_*tum 7

您可以@javax.faces.bean.ViewScoped通过在项目中包含Seam Faces 3.1.0 jar来开始工作.

如果失败(即您使用的是GlassFish 3.1.1或更早版本),您只需将Seam Faces 3.1.0中的ViewContextExtension.java,ViewScopedContext.java和javax.enterprise.inject.spi.Extension复制到您自己的项目中,确保您使用与Seam Faces相同的文件路径.java文件可以逐字复制.除了结尾的所有行都ViewContextExtension应该从javax.enterprise.spi.Extension中删除.

我在GlassFish 3.1.1中成功使用后一种方法,并将尝试前一种方法,即GlassFish 3.1.2发布.


Boz*_*zho 1

不,它不受直接支持。Seam3应该提供 CDI 所没有的额外功能。一探究竟。