2013-06-18 1 views
0

implementing exception handling in jsf web app에 대한 지침을 따릅니다.JSF 예외 처리, 요청 매개 변수를 얻으십시오

내 문제는 내가 여기

ExceptionHandler

에 설정하는 것이, 속성 값을 보여 ExceptionHandler.java

@Override 
public void handle() throws FacesException { 
    final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); 
    while (i.hasNext()) { 

     ExceptionQueuedEvent event = i.next(); 
     ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); 
     Throwable t = context.getException(); 

     FacesContext fc = FacesContext.getCurrentInstance(); 
     Map<String, Object> requestMap = fc.getExternalContext().getRequestMap(); 
     NavigationHandler nav = fc.getApplication().getNavigationHandler(); 

      try { 
       // Push some useful stuff to the request scope for 
       // use in the page 
       System.err.println("DefaultExceptionHandler.handle()...exceptionMessage = " + t.getMessage()); 
       requestMap.put("exceptionMessage", t.getMessage()); 
       nav.handleNavigation(fc, null, "error/500"); 
       fc.renderResponse(); 
      } finally { 
       i.remove(); 
      } 
     } 
    getWrapped().handle(); 
} 

및 500.xhtml

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:f="http://java.sun.com/jsf/core"> 


    The error message is: 
    <br /> 
    <b> 
     3. : #{exceptionMessage} 
    </b> 
    <br /> 
    <b> 
     1. : #{requestScope['exceptionMessage']} 
    </b> 
    <br /> 
    <b> 
     2. : #{param['exceptionMessage']} 
    </b> 

페이지입니다 브라우저의 모습은 다음과 같습니다 :

The error message is: 
3. : 
1. : 
2. : 

미리 감사드립니다.

+0

내가 param을 세션에 넣으면 # {exceptionMessage}로 액세스 할 수 있지만 요청할 수 있다면 – Kenny

+0

문제는 BalusC가 말했듯이 Face-redirect = true를 추가하는 RedirectNavigationHandler와 문제가 있습니다. 내가 추가 할 오류 페이지를 제외하고 지금은 작동합니다. 설명을 해준 BalusC에게 감사드립니다. 대답에 대해 – Kenny

답변

0

우선, 요청 매개 변수가 아닙니다. 요청 매개 변수는 최종 사용자 인이 HTTP 요청과 함께 서버에 보낸 데이터입니다. GET 요청에서 URL의 쿼리 문자열 부분에 표시됩니다. POST 요청에서는 요청 본문에 숨겨져 있지만 (F12 키로 액세스 할 수있는 브라우저의 기본 제공 브라우저와 같은 HTTP 트래픽 모니터에서 볼 수 있음) 당신이 설정 한 것은 요청 속성입니다. 그래서 시도에서 단지 #{exceptionMessage}#{requestScope['exceptionMessage']}이 효과가 있었음에 틀림 없다. 그러나 #{param['exceptionMessage']}은 그렇지 않다.

구체적 문제로 돌아 가면 내비게이션 케이스에서 <redirect>으로 리디렉션을 보내거나 사용자 정의 네비게이션 핸들러의 결과에 ?faces-redirect=true을 추가하여이 문제가 발생할 수 있습니다. 리디렉션은 기본적으로 클라이언트에게 새로운 HTTP 요청을 작성하도록 지시합니다. 이로써 모든 속성을 포함하는 초기 HTTP 요청이 삭제됩니다.

그다지 문제가 아닌 경우 FacesContext 또는 ExternalContext 구현이 사용중인 것 같습니다. 사용 된 JSF impl/version이나 사용 된 서버 및 "제 3 자"라이브러리에 대해 아무 것도 말하지 않았기 때문에 말하기가 어렵습니다. 예 : 스프링 웹 플로우 (Spring Web Flow)의 ExternalContext 구현은 일부 버전 에서처럼 구현이 중단 된 것으로 알려져 있습니다.

+0

주셔서 감사합니다. ? faces-redirect = true를 추가하는 사용자 지정 탐색 처리기가 있습니다. 그래서,이 문제가 발생할 것입니다. 하지만 제거 할 때 ExceptionHandler에서 리디렉션이 작동하지 않습니다. 로그 파일에서 ExceptionHandler가 예외를 처리 한 것을 볼 수 있습니다. ExceptionHandler와 NavigationHandler를 결합 할 수있는 해결책이 있습니까? – Kenny