11

我想@ViewScoped在我的应用程序中使用 - 范围作为某些网页的支持 bean。我还使用 CDI 将依赖项注入支持 bean。

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

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

@Inject注释不会注入任何东西,NullPointerException一旦我访问依赖项,我就会得到一个。

然而,当我用

@Named
@ViewScoped


@Inject
someDependency (...)

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

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

4

7 回答 7

12

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

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

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

干杯,

安迪

于 2011-02-25T20:14:37.850 回答
7

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

如果做不到这一点(即您使用的是 GlassFish 3.1.1 或更早版本),您可以简单地将 ViewContextExtension.java、ViewScopedContext.java 和 javax.enterprise.inject.spi.Extension 从 Seam Faces 3.1.0 复制到您自己的项目中,确保您使用与 Seam Faces 相同的文件路径。可以逐字复制 java 文件。ViewContextExtension应从 javax.enterprise.spi.Extension 中删除除以结尾的行之外的所有行。

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

于 2012-01-02T13:20:49.367 回答
1

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

于 2011-02-03T09:55:15.423 回答
1

您可以使用任何其他框架或等待新的 JEE7 来实现 @NormalScope 以创建自己的 CDI 范围

  • CDI在每个 bean 调用后触发一个事件AfterBeanDiscovery
  • 您可以使用 CDI 扩展来@Observes此事件并添加您的上下文实现
  • 在您的范围实施中,您可以:
    1. 使用Contextual通过FacesContext ViewRoot Map的名称获取您的 bean,并在每次 ajax 回调后返回它
    2. 如果找不到第一步中的 bean 名称,请使用CreationalContext在FacesContext ViewRoot Map中创建它

为了更深入的解释,我推荐这个链接:http ://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

于 2013-04-26T10:20:23.020 回答
0

我不使用Seam,只是普通的JSF + PrimeFaces。我刚刚找到了这个,我要试一试……你可能也想试试。

于 2011-07-26T12:15:16.480 回答
0

Weld 与 Seam-Faces 结合可以提供它,但它已损坏。关于它的一个有趣的线程和它的替代方案是例如http://forum.primefaces.org/viewtopic.php?f=3&t=7585

于 2011-08-25T15:50:15.617 回答
0

我认为 Apache CODI 或 Seam 3 解决了这个问题。有一个名为 DeltaSpike 的新项目可能会这样做,认为它会继续 Seam 3。

在 Java EE 7 中,这个问题将得到解决,因为我知道所有的 bean 都是 CDI bean,所以没有 JSF bean。

于 2013-04-20T23:16:02.497 回答