【问题标题】:java ee - JSF 2.0 ViewScoped Bean after redirect to new window NPEjava ee - 重定向到新窗口 NPE 后的 JSF 2.0 ViewScoped Bean
【发布时间】:2012-11-30 06:59:51
【问题描述】:

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

【问题讨论】:

  • 服务器不知道你是在新窗口中打开页面还是一样,所以它解释你在打开新页面时视图发生了变化。发布为评论,因为我不知道您如何解决它(除了制作有问题的 bean @SessionScoped

标签: jsf jakarta-ee jsf-2


【解决方案1】:

确实,初始选项卡/窗口中的视图范围 bean 通过返回 String 导航案例结果而被杀死。您想返回 nullvoid 以使其保持活力。根据您的另一个问题中显示的newTab() 代码,您需要用Faces#redirect() 调用替换导航案例(假设它确实是OmniFaces,您在那里使用Faces#setFlashAttribute())。您只需事先将Flash#setRedirect() 设置为true 即可指示flash 作用域将发生重定向。

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}

【讨论】:

  • 谢谢!现在它完全可以工作了。但是我必须使用 void 操作方法 - 返回 null 会导致重定向在同一个选项卡中打开
  • 谢谢。但是没有 OmniFaces 怎么办呢?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 2011-06-24
    • 1970-01-01
    • 2012-04-23
    • 2015-01-14
    • 2012-06-09
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多