1

我使用这篇文章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。

4

2 回答 2

2

实际上,初始选项卡/窗口中的视图范围 bean 通过返回String导航案例结果而被杀死。你想返回nullvoid让它活着。根据newTab()您的其他问题中显示的代码,您需要通过Faces#redirect()调用替换导航案例(假设它确实是您在那里使用的OmniFacesFaces#setFlashAttribute())。您只需要预先设置Flash#setRedirect()true以指示将发生重定向的 Flash 范围。

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}
于 2012-12-12T14:51:05.490 回答
1

ViewScope bean 仅在您回发到同一视图时才存在。

如果您回发到其他视图,您的action数据将丢失,因为 ViewScope bean 将被重新创建。

于 2012-12-12T14:45:35.450 回答