CDI缺失@ViewScoped和@FlashScoped

6
为什么Java EE 6 CDI缺少@ViewScoped和@FlashScoped注释?(特别是前者让我感到惊讶,因为CDI源于Seam世界,该世界已经了解非常相似的ScopeType.PAGE...)
在使用CDI时,有什么推荐的解决方法?使用Seam 3?
谢谢
2个回答

12

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

@FlashScoped 在 JSF 中不存在。JSF flash scope 基本上是由一个短暂的 cookie 支持的映射,该 cookie 在 HTTP 重定向后仍然存在。您无法让 JSF 将受管 bean 放在此范围内。您必须自己手动将值放入/从映射中获取值,并/或使用 EL 中的 #{flash} 引用,该引用基本上引用了该映射。Seam Faces 已经劫持了 JSF 特定的 javax.faces.bean 包以进行其 @FlashScoped 注释,但这绝对不是标准 JSF API。

还请参阅:


这个CDI/JSF的东西在概念上仍然让我很困扰。但是了解CDI没有视图的概念是有意义的。然后我必须掌握这个:http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/... 然后Seam 3应该坐在CDI和JSF+其他Java EE技术之间,而不是在CDI之上。我认为很难理解。 - Kawu
如果你是新手,这确实很令人困惑。我强烈建议你现在不要将各种依赖注入方法混合到一个Web应用程序中。这样你只能集中精力学习某个框架的注释。至于Seam,那是一个完全不同的框架。几年前,它是基于注释的注入方法背后的创新者,后来被JSF2和CDI接管了。 - BalusC
Seam Faces页面仍然声称它实现了javax.faces.bean.FlashScoped。听起来规范在那个“作用域”方面发生了变化。你知道发生了什么事情,Seam实际上是做什么的吗? - kaqqao
我已经有一段时间没有使用Seam了,现在我直接开发CDI。在CDI中有一个@RequestScope,它与Flash Scope高度对应。 - Tristan
@Tristan:CDI请求范围绝对不同于JSF闪存范围。它的生命周期与JSF请求范围完全相同。您的困惑可能是由JSF组件树的状态引起的。在提交后,它仍然保留自己的视图范围。 - BalusC
我刚刚成功地尝试了新的JSF 2.2 @javax.faces.view.ViewScoped。很高兴它能够工作,我非常高兴现在可以将CDI与ViewScoped范围结合使用,但我认为这是Java EE的又一个设计缺陷。现在我们有了javax.faces.bean中的JSF范围,javax.enterprise.context中可用于JSF的CDI范围,以及CDI / JSF的javax.faces.view中的新范围。 - cljk

1
您可以实现上下文,并使用@NormalScope创建自己的CDI作用域,而无需使用任何其他框架或等待新的JEE7。
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/

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