【问题标题】:JSTL c:forEach causes CDI (Seam 3) @ViewScoped bean to invoke @PostConstruct on every AJAX request using Mojarra 2.1.18+JSTL c:forEach 导致 CDI (Seam 3) @ViewScoped bean 使用 Mojarra 2.1.18+ 在每个 AJAX 请求上调用 @PostConstruct
【发布时间】:2014-03-21 17:00:43
【问题描述】:

这是 stackoverflow.com 上一些问题的后续问题:

JSTL c:forEach causes @ViewScoped bean to invoke @PostConstruct on every request

Why does @PostConstruct callback fire every time even though bean is @ViewScoped? JSF

但是,我们使用的是 Mojarra 2.1.22,但我们的 Seam 3 CDI @ViewScoped 注释 bean 总是被重构,即执行带有 @PostConstruct 注释的方法,并且我们在每个 AJAX 请求上都会获得一个新 bean。

几个月来我一直听到的消息(现在是 2014 年 2 月)是 Mojarra 2.1.18+ 修复了许多这些错误,并且当视图从<c:forEach items="#{mySeam3CdiViewScopedBean.items}" ... >.

这里有一些错误:

https://java.net/jira/browse/JAVASERVERFACES-1665

https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-928

https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-787

https://java.net/jira/browse/JAVASERVERFACES-2688

与我在顶部提到的示例的唯一区别是我们使用的是 Seam 3.1 Faces CDI @ViewScoped (+ @Named) 而不是“原生”JSF @ViewScoped ( + @ManagedBean)。

问题

Seam 3 Faces (3.1 Final) 是它不起作用的原因吗?

(我们怎样才能知道?将我们所拥有的内容转化为测试用例并不容易......也许有人知道?)


PS:我知道这更像是一个论坛问题,但我希望这里处理 JSF 2 但不一定是 Seam 3(Faces)的人可以提供反馈。

【问题讨论】:

  • 您使用的是 Mojarra 2.1.18。这仅在 JSF 2.2 (Mojarra 2.2) 中得到修复。该错误将出现在您的构建中。
  • 如前所述,我们正在使用 Mojarra 2.1.22。 ;-)

标签: jsf-2 jstl cdi view-scope seam3


【解决方案1】:

关于您的问题的一些评论:

  • 不建议在 JSF 中使用 JSTL 循环,因为它不在 JSF 生命周期中进行管理。使用 facelets ui:repeat 是一种很好的做法
  • Seam 3 已弃用,您应该避免使用它,因为如果问题来自这里,您将得不到任何支持。

您有两种解决方案(按优先顺序):

但是在这两种情况下,尝试在您的 JSF 页面中去掉 JSTL,它会导致很多奇怪的问题。

【讨论】:

  • 手头的问题无法使用 ´´ 解决。菜单项列表中没有呈现任何内容(使用 PrimeFaces)。所以我们有点卡在“”上,或者我们不得不使用一些可怕的技巧。
  • Primefaces 在ui:repeat 发生之前构建它的组件,所以没有必要为此使用它。但是,提醒您始终可以选择将组件绑定到托管 bean,而不是使用 for each。这样,您就可以在 Java 端处理组件,然后再将其显示在视图上。
  • 使用组件绑定对@ViewScoped bean 有一些影响:请参阅java.net/jira/browse/JAVASERVERFACES-1492 以了解更著名的错误。
猜你喜欢
  • 2011-02-20
  • 2015-12-03
  • 2011-07-29
  • 1970-01-01
  • 2014-10-17
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多