2013-08-01 3 views
6

따라서 두려운 javax.faces.application.ViewExpiredException에 직면 한 후 적절한 해결책을 찾기 위해 인터넷을 둘러 봐야했습니다. 다행히도 솔루션을 쉽게 사용할 수 있으며 OmniFaces FullAjaxExceptionHandler을 채택했습니다.침묵 FullAjaxExceptionHandler

OmniFaces의 거의 모든 것들과 마찬가지로, 그것은 놀라운 일을했습니다. 하지만, 내가보기 만료 한 때마다 나는 점점 오전 :

SEVERE: WebModule[/myModule]FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/WEB-INF/errorpages/test.xhtml' will be shown. 
javax.faces.application.ViewExpiredException: viewId:/my/page.xhtml - View /my/page.xhtml could not be restored. 
... 

가 예상대로 처리로이 괜찮지 만 이 server.log에에 인쇄되는이 예외를 침묵 어쨌든 무엇입니까? 이것은 로그를 매우 빠르게 군중시킬 것이다.

나는 실행하고 있습니다 :
인 Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013년 7월 1일

당으로
글래스 피시 3.1.2.2

답변

6

에 OmniFaces 1.6의 경우, 다음과 같이 메소드를 확장하여 logException() 메소드를 대체하여 ViewExpiredException의 스택 추적을 건너 뛸 수 있습니다.

public class YourAjaxExceptionHandler extends FullAjaxExceptionHandler { 

    public YourAjaxExceptionHandler(ExceptionHandler wrapped) { 
     super(wrapped); 
    } 

    @Override 
    protected void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) { 
     if (exception instanceof ViewExpiredException) { 
      // With exception==null, no trace will be logged. 
      super.logException(context, null, location, message, parameters); 
     } 
     else { 
      super.logException(context, exception, location, message, parameters); 
     } 
    } 

} 

주위에 공장을 만듭니다

이 실행 faces-config.xml에서 공장으로 일반적인 방법으로 그것을 등록 얻기 위하여
public class YourAjaxExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory wrapped; 

    public YourAjaxExceptionHandlerFactory(ExceptionHandlerFactory wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
     return new YourAjaxExceptionHandler(getWrapped().getExceptionHandler()); 
    } 

    @Override 
    public ExceptionHandlerFactory getWrapped() { 
     return wrapped; 
    } 

} 

(FullAjaxExceptionHandlerFactory에 대한 원래의 등록을 제거하는 것을 잊지 마세요) :

<factory> 
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory> 
</factory> 
+0

좋은 신사는 신사입니다! 많은 감사합니다. – blo0p3r

+0

@BalusC 스위치가'MyAjaxExceptionHandler # logException'에 없습니다. 이 행은 else 안에 있어야합니다 :'super.logException (context, exception, location, message, parameters);'. 또한, faces-config.xml' '가 com.example.MyAjaxExceptionHandlerFactory 여야한다고 착각하지 않는다면. –

+0

@ 패트릭 : 답변이 업데이트되었습니다. 감사! – BalusC