2013-01-16 4 views
4

데이터를 저장할 때 새 항목을 추가하는 페이지가 하나 있습니다. "데이터가 성공적으로 저장되었습니다"라는 메시지를보고 싶은 다른 페이지로 이동합니다. 그 메시지가 요청 스코프에 속해있어서 플래시 스코프를 사용하는 이유를 읽었습니다.리디렉션 된 페이지로 플래시 메시지 보내기

context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful"); 
context.getExternalContext().getFlash().setKeepMessages(true); 
return outcome; 

이 첫 페이지 addSeason.xhtml에 저장 버튼으로 호출됩니다.

<p:commandButton id="save" action="#{controller.add}" 
       value="#{msg.save}" ajax="true" 
       type="submit" update="@form"/> 

탐색 규칙은 다음과 같이 정의됩니다.

<navigation-rule> 
    <from-view-id>/competitions/addSeason.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>success</from-outcome> 
     <to-view-id>/competitions/calendarGame.xhtml</to-view-id> 
     <redirect/> 
    </navigation-case> 
    <navigation-case> 
     <from-outcome>fail</from-outcome> 
     <to-view-id>/competitions/calendarGame.xhtml</to-view-id> 
     <redirect/> 
    </navigation-case> 
</navigation-rule> 

그러나 대상 페이지에서 calendarGame.xhtml 나는 내 메시지를받지 못했습니다.

<p:growl id="growl" globalOnly="true" sticky="true"/> 

서버 로그에도이 경고가 표시됩니다.

은 [javax.enterprise.resource.webcontainer.jsf.flash] (AJP - 127.0.0.1-8009-1를) 경고 JSF1095는 : 응답은 이미 우리가 보내는 쿠키를 설정하려고 시간에 의해 자행되었다 전조등. 플래시에 저장된 모든 값은 다음 요청에서 사용할 수 없습니다.

문제점을 어떻게 해결할 수 있습니까?

답변

6

이 문제는 두 가지입니다.

첫 번째 문제에 관해서는, 나는 당신이 액션 메시지에 얼굴 메시지를 추가하고있는 것이지, 프리 렌더 뷰가 아니라는 것을 모았습니다. 거기에 return outcome이 있으므로 실제 조치 방법에 포함되어 있다는 의미가됩니다. 이 경우 JSF1095 메시지는 Mojarra의 Ajax 인코딩 관련 버그로 인해 발생하며 2.1.11에서 수정되었습니다. Mojarra는 2.1.14에서 마지막으로 수정 된 많은 플래시 스코프 관련 문제를 가지고 있습니다. Mojarra를 이상으로 업데이트 하시길 바랍니다. 적어도 그 버전입니다. 2.13에 이미 currently입니다.

두 번째 문제에 대해서는 <p:growl globalOnly="true">은 클라이언트 ID가 null 인 메시지 만 표시합니다. addMessage() 전화를 수정하여 대신 null을 전달하십시오. 당신이 탐색 전에 사전 렌더링 이벤트 기간 동안 얼굴의 메시지를 추가 실제로 인 경우

context.addMessage(null, message); 

, 다음 문제는 다른 원인이있을 것입니다 및 다른 솔루션을 필요로한다. 다른 대답은 Mojarra 2.1.14 flash scope messages and redirect to different path입니다.

+0

@BalucC 대단히 감사합니다.) – Ray

+0

안녕하십니까. – BalusC

0

수신 페이지 /보기에서 메시지를 설정해야합니다. 그러기 위해서, 나는 preRenderViewEvent이라는 함수를 시도 할 것이다. 코드를 추가해야하는 곳이 있습니다 (다른 형태의 메시지 알림을 사용할 수도 있음)

preRenderViewEvent 사용 예입니다.