CDI缺少@ViewScoped和@FlashScoped

为什么Java EE 6 CDI缺少@ViewScoped和@FlashScoped注释? (特别是前者让我很奇怪,因为CDI源于Seam世界,它已经知道了非常相似的ScopeType.PAGE …)

使用CDI时建议的解决方法是什么? 使用Seam 3?

谢谢

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

JSF 中不存在 @FlashScoped 。 JSF 闪存范围基本上存在一个映射,该映射由短生命cookie支持,该cookie在HTTP重定向中幸存。 你不能让JSF把托管bean放在这个范围内。 您必须自己在地图中手动输入/获取值和/或使用EL中的#{flash}参考,它基本上反映了地图。 然而, Seam Faces为其@FlashScoped注释劫持了JSF特定的javax.faces.bean包,但这绝对不是来自标准的JSF API。

也可以看看:

  • 在Request Scoped Bean中添加项目列表 – 包含CDI替代项的一些具体示例

您可以使用任何其他框架或等待新的JEE7来实现上下文并使用@NormalScope创建您自己的CDI Scope。

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

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