CDI 缺少 @ViewScoped 和 @FlashScoped

Posted

技术标签:

【中文标题】CDI 缺少 @ViewScoped 和 @FlashScoped【英文标题】:CDI missing @ViewScoped and @FlashScoped 【发布时间】:2011-12-10 09:50:31 【问题描述】:

为什么 Java EE 6 注释? (尤其是前者让我感到奇怪,因为 CDI 源于 Seam 世界,它已经知道非常相似的 ScopeType.PAGE...)

使用 CDI 时推荐的解决方法是什么?使用接缝 3?

谢谢

【问题讨论】:

【参考方案1】:

@ViewScoped 特定于 MVC 框架 JSF,而不是依赖注入框架 CDI。只要您与同一个 JSF 视图交互,视图范围就存在。 CDI 并没有真正的“视图”概念。 CDI 的替代方案是@ConversationScoped,它的寿命比请求范围长,但比会话范围短。您只需要自己控制终止。如有必要,您可以使用 MyFaces CODI 将 JSF @ViewScoped 桥接到 CDI @Named bean。即将推出的 JSF 2.2 将在 javax.faces.view 包中包含与 CDI 兼容的 @ViewScoped

JSF 中的 @FlashScoped doesn't exist。 JSF flash scope 基本上存在一个地图,该地图由一个短暂的 cookie 支持,该 cookie 在 HTTP 重定向中幸存。您不能让 JSF 将托管 bean 放在这个范围内。您必须自己手动在地图中/从地图中放入/获取值和/或在 EL 中使用 #flash 参考,它基本上引用了地图。然而,Seam Faces 劫持了 JSF 特定的 javax.faces.bean 包的 @FlashScoped 注释,但这绝对不是来自标准 JSF API。

另见:

Add items to List in Request Scoped Bean - 包含 CDI 替代品的一些具体示例

【讨论】:

这个 CDI / JSF 的东西在概念上仍然让我很生气。但是知道 CDI 没有视图的概念是有道理的。然后我必须坚持这一点:verborgh.be/articles/2010/01/06/… ... 那么 Seam 3 必须位于 CDI 和 JSF + 其他 Java EE 技术之间,而不是位于 CDI 之上。恕我直言,很难掌握。 如果您是新手,这确实令人困惑。我强烈建议您现在不要将各种依赖注入方法混合到单个 web 应用程序中。这样你就可以只专注于某个框架的注解。至于Seam,那是一个完全不同的框架。几年前,基于注解的注入方法背后的创新者后来被 JSF2 和 CDI 接管。 Seam Faces 页面仍然声称它实现了 javax.faces.bean.FlashScoped。听起来规范在“范围”方面发生了变化。你可能知道那里到底发生了什么,Seam 究竟做了什么? 我已经有一段时间没有使用Seam了,我现在直接开发CDI。 CDI中有一个@RequestScope,与Flash Scope高度对应。 @Tristan:CDI 请求范围与 JSF 闪存范围绝对不同。它具有与 JSF 请求范围相同的生命周期。您的困惑可能是由 JSF 组件树的状态引起的。它仍然在回发中保持自己的视图范围。【参考方案2】:

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

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

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

【讨论】:

以上是关于CDI 缺少 @ViewScoped 和 @FlashScoped的主要内容,如果未能解决你的问题,请参考以下文章

为什么GlassFish 5.1.0中的JSF将我的@ViewScoped CDI bean的ID属性设置为null?

ViewMapListener JSF 未被调用

如何检测和删除(在会话期间)不能被垃圾收集的未使用的 @ViewScoped bean

多个浏览器选项卡上的 ViewScoped bean 冲突

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

您如何在当前视图(范围)中找到 CDI bean?