2012-12-12 37 views
1

我使用這篇文章中的提示https://stackoverflow.com/a/13838907來打開新標籤,但是當我回到舊標籤時,我得到nullPointerException並且我的ViewScoped bean數據丟失。java ee-JSF 2.0 ViewScoped Bean重定向到新窗口NPE

<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

服務器不知道,如果你要打開的頁面中的一個新窗口或相同的,所以它解釋的是打開新頁面時,你的看法發生了變化。發表評論是因爲我不知道如何解決這個問題(除了製作有問題的bean'@ SessionScoped'。 – SJuan76

回答

2

事實上,初始選項卡/窗口中的視圖範圍的bean通過返回String導航案例結果而死亡。您想返回nullvoid以使其保持活動狀態。根據您的其他問題中顯示的newTab()代碼,您需要用Faces#redirect()呼叫(假設它的確是OmniFaces,您在此使用Faces#setFlashAttribute())來替換導航情況。您只需預先將Flash#setRedirect()設置爲true,即可指示閃光範圍發生重定向。

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

謝謝!現在它已經完全工作了,但是我必須使用void action方法 - 返回null會導致在同一個標​​籤中打開重定向 – mm1

+0

謝謝。但是如何在沒有OmniFaces的情況下做到這一點? – ovonel

1

只要您回發到相同的視圖,ViewScope豆子就會生活。

如果您發回action中的其他視圖,數據將會丟失,因爲ViewScope bean將被重新創建。