【问题标题】:Using OmniFaces 2.1 ViewScoped with Spring 3.1.0 in JSF 2.2在 JSF 2.2 中使用 OmniFaces 2.1 ViewScoped 和 Spring 3.1.0
【发布时间】:2015-08-14 22:10:52
【问题描述】:

我正在尝试将一些页面转换为视图范围(来自会话范围)以启用多个浏览器选项卡以支持显示来自数据表中多个条目的数据。

有谁知道按照这个 PrimeFaces 博客 Porting JSF 2.0′s ViewScope to Spring 3.0 中的步骤是否可以扩展 Spring 以使用 Omnifaces 2.1 中的 org.omnifaces.cdi.ViewScoped

【问题讨论】:

  • 给定的移植示例对您来说究竟是什么不足,以至于您特别要求使用 OmniFaces @ViewScoped
  • 我今天刚读到,现在找不到的地方,从 JSF 2.2 开始,您应该使用 JSF ViewScope,而不是 Omnifaces。
  • @EJP:在 JSF 2.0/2.1 中,@PreDestroy@ViewScoped bean 并不总是得到适当考虑。 OmniFaces 解决了这个问题。后来在 JSF 2.2 中,它也被修复了。所以使用 OmniFaces @ViewScoped 在 JSF 2.2 中没有任何好处。但是,我不清楚那个 Spring 端口是否也考虑了破坏。也许它未能正确触发/执行销毁,因此 OP 专门要求 OmniFaces @ViewScoped
  • 您好 BalusC,感谢您的回复。确定之前是否已经这样做以及是否存在任何问题,这更像是一个问题,但我没有注意到您所描述的任何限制。如果在 Spring 中使用 JSF 2.2 或 omnifaces 之间没有已知差异,我将尝试标准的 JSF 2.2 之一。我很高兴接受您上面描述没有好处等的评论作为对我问题的回答。随意剪切和粘贴,我会接受的。

标签: spring jsf jsf-2.2 omnifaces jboss-weld


【解决方案1】:

您可以使用您找到的博客中描述的方法。只有您没有也不能完全以这样的方式移植,以至于它在幕后实际上使用了特定的 @ViewScoped 注释。基本上,您应该实现与那些注释在幕后使用相同的代码。

标准 JSF @ViewScoped 和 OmniFaces @ViewScoped 在幕后的工作与博客中描述的基本相同:通过 UIViewRoot#getViewMap() 引用 bean 实例。只是,JSF 2.0/2.1 @ViewScoped 在所有情况下都没有正确触发 bean 的 @PreDestroy。例如。当底层 HTTP 会话过期时,它们不会被调用。 OmniFaces 为 JSF 2.0/2.1 用户解决了这些问题。 JSF 本身已经在 2.2 中解决了这些问题。所以在 JSF 2.2 中没有真正的理由使用 OmniFaces @ViewScoped

虽然我想在这里暗示一下,当使用 OmniFaces @ViewScoped bean 时,我计划为未来的 OmniFaces 2.2 添加一个 beforeunload 钩子到 <o:form>,这样 bean 也真的当用户通过 GET 导航离开,或刷新页面,或关闭浏览器窗口时被销毁,使其再次变得更有用:)

【讨论】:

  • 感谢您的回复。我注意到这个链接:github.com/javaplugs/spring-jsf 这个链接是否表明正在执行适当的 bean 销毁?
  • 我没进Spring不敢说。
  • 快速更新:使用上面的示例链接当然可以。虽然我并不完全清楚我是否需​​要在 registerDestructionCallback 方法中做任何事情,或者是否会自动处理。这是我目前拥有的(它是空的,但确实被调用): Override public void registerDestructionCallback(String arg0, Runnable arg1) { // TODO 自动生成的方法 stub log.debug("registerDestructionCallback for bean " + arg0); }
猜你喜欢
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2013-09-02
  • 2014-04-28
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多