为什么我的@ViewScoped bean在bean被破坏后被浏览器刷新,而POST被渲染到新页面?

时间:2013-09-25 00:34:20

标签: jsf-2 primefaces cdi omnifaces view-scope

首先,我使用的OmniFaces CDI @ViewScoped最近已添加到OmniFaces 1.6并在OmniFaces 1.6中发布。我很高兴在我的应用程序中使用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步之后,我自己或最终用户进行了“浏览器刷新”(谷歌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.

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

Is JSF 2.0 View Scope back-button safe?

What scope to use in JSF 2.0 for Wizard pattern?

ViewScoped works like RequestScoped - why?

jsf clearing the form

这是由于我的设计不好(作为2岁的JSF开发人员)吗?

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

请告知/确认。感谢。

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

0 个答案:

没有答案