2

首先,我使用的是最近添加到 OmniFaces 1.6 并在其中发布的 OmniFaces CDI @ViewScoped。我很高兴在我的应用程序中使用 OmniFaces CDI @ViewScoped,但我有一个问题。

我注意到我的(TomEE 1.6 快照)服务器日志中有一些 NullPointerException,我什至在测试使用/引用标有 OmniFaces CDI @ViewScoped 的 bean 的页面时遇到了 NullPointerException。当我通常执行类似于以下操作时会发生 NullPointerException:

(1) “呈现”引用/使用 CDI @ViewScoped bean 的页面。

(2)单击存在'view'的(PrimeFaces)commandButton/Link(下),commandButton/Link action="..." 负责销毁@ViewScoped bean。

<p:commandButton value="Exit Messenger"
                 action="#{messengerBean.exitMessenger()}"
                 ajax="false"/>

public String exitMessenger() {
    pageNavigationController.setToBlankPage();
    // to destroy this CDI @ViewScoped bean
    return "index.xhtml";
}

(3) 在上面的第 2 步之后,我自己或最终用户立即执行“浏览器刷新”(Google Chrome 中的 F5 键),并且由于某种/无论什么原因,CDI @ViewScoped bean(由上面的第 1 步引用)在没有正在重建的 bean...正确,因为 actionListener=#{viewScopedBean.methodToPrepareStep1View()} 或 action="#{viewScopedBean.methodToPrepareStep1View()}" 不是由“浏览器刷新”按钮/请求调用的。

(4) 因此,@ViewScoped bean 成员为“null”,并且当用户“意外”按 F5 或执行“浏览器刷新”时会引发 NullPointerException。

注意:状态保存 = 服务器和(HTTP)过滤器指示浏览器“不”通过以下方式缓存 jsf/xhtml 页面(很久以前我从 BalusC 学到的,在 stackoverflow.com 上):

res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.

另外,我阅读了以下其他/相关帖子:

JSF 2.0 View Scope 后退按钮安全吗?

在 JSF 2.0 中用于向导模式的范围是什么?

ViewScoped 像 RequestScoped 一样工作 - 为什么?

jsf清除表格

这是因为我(作为 2 岁的 JSF 开发人员)的糟糕设计吗?

我是否需要测试所有引用 CDI @ViewScoped bean 的 xhtml 页面,并重复我上面列出的步骤,然后在我的代码中到处处理 NullPointerException ......这是由“浏览器刷新”引起的?这是解决此问题的唯一方法,还是有更好的更推荐的方法来处理(或避免)CDI @ViewScoped bean 销毁后由浏览器刷新引起的 NullPointerException?

请告知/确认。谢谢。

编辑:(2)上面有“正确”的描述和有助于复制这个问题的代码。

4

0 回答 0