2012-12-12 2 views
1

나는이 게시물의 팁을 https://stackoverflow.com/a/13838907으로 사용하여 새 탭을 엽니 다. 이전에 돌아 가면 nullPointerException이 발생하고 ViewScoped 빈 데이터가 손실됩니다.자바 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

서버는 새 창이나 다른 페이지에서 페이지를 여는 지 알지 못하므로 새 페이지를 열 때보기가 변경된 것으로 해석합니다. 어떻게 해결할 수 있는지 모르겠으므로 댓글로 게시 됨 (잘못된 세션을 만드는 것 이외의 @ SessionScoped) – SJuan76

답변

2

사실, 초기 탭/창에서 뷰 범위 Bean은 String 탐색 케이스 결과를 반환하여 종료됩니다. 0으로 채우려면 null 또는 void을 반환하고 싶습니다. 다른 질문에 표시된 newTab() 코드를 기반으로 탐색 케이스를 Faces#redirect() 전화로 바꿔야합니다 (Faces#setFlashAttribute()에 실제로 사용하는 코드는 OmniFaces이라고 가정). 플래시 범위에 리디렉션이 발생하도록 지시하려면 미리 Flash#setRedirect() ~ true으로 설정하면됩니다.

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

고마워! 이제 완전히 작동하지만 무효 액션 메소드를 사용해야합니다. null을 반환하면 동일한 탭에서 리디렉션이 열립니다. – mm1

+0

감사합니다.하지만 OmniFaces없이 어떻게 할 수 있습니까? – ovonel

1

ViewScope 빈은 동일한보기로 다시 게시하는 동안 만 살아갑니다.

action의 다른보기에 다시 게시하면 ViewScope 빈이 다시 작성되므로 데이터가 손실됩니다.

관련 문제