我有一个 viewScoped bean,它具有一些业务逻辑验证。 我使用
将此验证产生的错误显示到页面上FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, result, null));
问题是:
- 用户提交无效表单
- 表单重新显示,由于使用 PRG,消息未向用户显示
我使用以下代码行解决了这个问题:
FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
现在的问题是业务逻辑验证消息持续时间太长:
- 用户提交无效表单
- 重新显示表单并显示错误消息
- 用户更正并提交有效的表单
- 表单重新显示,并显示“成功”消息,但也显示之前的错误消息。
我该如何解决这个问题?
最佳答案
根据您的问题评论,您使用的是 Mojarra 2.0.3:
[JSFImplManagementDeployer] Initialized 3 JSF configurations: [Mojarra-1.2, MyFaces-2.0, Mojarra-2.0] [javax.enterprise.resource.webcontainer.jsf.config] Initializing Mojarra 2.0.3 ( b05)
这确实是一个古老的 Mojarra 版本。目前已经3.5岁多了! (2010 年 7 月发布)。您的具体问题是由具体 issue 1751 引起的在 2.0.7/2.1.4 中已修复。然而,随后出现了许多与闪存范围相关的其他问题报告。 Flash 范围位于较旧的 Mojarra 版本中,存在以下主要问题:
- issue 1751 - Flash scoped messages lives longer than next request - fixed in 2.0.7 / 2.1.4
- issue 2126 - Flash cookie enables data exploits - fixed in 2.1.24 / 2.2.1
- issue 2136 - Flash cookie not available when redirected to different path - fixed in 2.1.14 / 2.2.0
- issue 2902 - Flash cookie uses wrong path for applications on root - fixed in 2.1.24 / 2.2.1
- issue 2955 - Flash creates sometimes version1 cookies which fails in IE<=10 - fixed in 2.1.25 / 2.2.2
- issue 2973 - Flash causes NPE on stale cookies after a session expire - fixed in 2.1.25 / 2.2.2
- issue 2862 - Flash cookie not cleared when stale - fixed in 2.1.27 / 2.2.5
总而言之,结论是您需要至少升级到 Mojarra 2.1.27/2.2.5 才能摆脱所有这些问题。
记录器中的 JSFImplManagementDeployer
条目可被识别为 JBoss 6.x 中的条目。古老的 Mojarra 2.0.3 反过来表明您仍在使用第一个 JBoss 6.0.0 版本。这充满了错误,强烈建议升级到更新的 JBoss 服务器,不仅可以修复这些 Mojarra 问题,还可以修复许多其他问题。考虑升级到 JBoss AS 7.3.x 或 EAP 6.2.x。如有必要,您可以根据此答案中的说明升级其捆绑的 Mojarra:Upgrade JSF / Mojarra in JBoss AS / EAP / WildFly .
关于JSF 消息持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168059/