【问题标题】:View Scope in CDI Weld在 CDI Weld 中查看范围
【发布时间】:2011-06-19 09:35:48
【问题描述】:

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

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

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

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

但是,当我用

装饰支持豆时
@Named
@ViewScoped


@Inject
someDependency (...)

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

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

【问题讨论】:

    标签: scope cdi jboss-weld


    【解决方案1】:

    不,不直接支持。 Seam3 应该提供 CDI 没有的额外功能。看看吧。

    【讨论】:

    • 感谢您的回复。 CDI中没有ViewScope真的很奇怪。如果我不想在我的项目中添加更多框架或库,我该如何实现以下目标:我有一个 jsf 页面的支持 bean。该 bean 保存了用户的一些输入(因此在此期间不应销毁 bean!)并且在用户点击提交后,输入被处理并且 bean 可能被销毁。我不想使用会话范围或应用程序范围。我可以通过标准 CDI 以某种方式实现这一点,也许是对话范围?我的意思是这是一个非常基本的情况,应该有可能
    • seam3 最终版本刚刚发布。你知道它是否完全支持GF 3.1。我知道在最终版本之前 GF 3.1 存在一些问题,但我不确定最终版本是否全部修复
    • Seam Faces 3.1.0 和 GlassFish 3.1.1 仍然不行。仅当您使用最新的 Weld 修补 GlassFish 时它才有效,但对于许多人来说这是不切实际的。 GlassFish 3.1.2 将包含 Weld 的更新(除其他外),第一个候选版本将于 2012 年 1 月结束。
    【解决方案2】:

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

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

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

    干杯,

    安迪

    【讨论】:

      【解决方案3】:

      我不使用Seam,只是普通的JSF + PrimeFaces。我刚刚找到this,我将尝试一下……您可能也想尝试。

      【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

            • 非常有趣的实现。
            猜你喜欢
            • 2016-11-14
            • 2016-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-15
            • 2013-07-14
            • 2013-09-15
            相关资源
            最近更新 更多