我使用这篇文章https://stackoverflow.com/a/13838907中的提示打开新标签,但是当我回到旧标签时,我得到nullPointerException并且我的ViewScoped bean数据丢失了。
<h:form target="_blank">
<p:commandButton value="open new tab" action="#{otherBean.newTab}" ajax="false" />
</h:form>
<h:form>
<p:commandButton value="this wll cause NPE" action="#{pageBean.action}"/>
</h:form>
单击第一个按钮,返回上一个选项卡,单击第二个按钮。再次创建PageBean,所有数据都将丢失。这两个bean都是ViewScoped。
答案 0 :(得分:2)
实际上,返回String
导航案例结果会导致初始标签/窗口中的视图范围内的bean被杀死。您希望返回null
或void
以保持活着状态。根据您在其他问题中显示的newTab()
代码,您需要通过Faces#redirect()
调用替换导航案例(假设您确实OmniFaces使用了{{3}} {{3}} 1}})。您只需要事先将Faces#setFlashAttribute()
设置为Flash#setRedirect()
,以指示Flash范围将发生重定向。
true
答案 1 :(得分:1)
ViewScope bean才会生效。
如果您回传到action
数据中的其他视图,将会丢失,因为将重新创建ViewScope bean。