2014-01-20 3 views
2

아약스 요청 중 (ViewExpired) Exception을 처리하기 위해 OmniFaces (1.7) FullAjaxExceptionHandler을 사용하고 있습니다.OmniFaces의 logException 메소드 대체 FullAjaxExceptionHandler가 호출되지 않습니다.

기본 구현 에서처럼 SEVERE 수준의 예외를 로그하는 데 FullAjaxExceptionHandler를 사용하고 싶지 않습니다. 따라서 logException 메서드를 재정의했지만 재정의 된 메서드가 아닌 기본 메서드가 여전히 호출됩니다.

나는 다음과 같은 공장 등록 :

여기
<factory> 
    <exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory> 
    </factory> 

    <factory> 
     <exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory> 
    </factory> 

ViewExpiredExceptionHandlerFactory입니다

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory parent; 

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) { 
    this.parent = parent; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
    ExceptionHandler result = parent.getExceptionHandler(); 
    result = new ViewExpiredExceptionHandler(result); 

    return result; 
    } 

} 

및 확장 FullAjaxExceptionHandler

public class ViewExpiredExceptionHandler extends FullAjaxExceptionHandler { 

    private static final Logger LOGGER = Logger.getLogger(ViewExpiredExceptionHandler.class); 

    private ExceptionHandler wrapped; 

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) { 
    super(wrapped); 
    this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getWrapped() { 
    return this.wrapped; 
    } 

    @Override 
    public void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) { 
    String user = UserFilter.readUserIdFromSession(); 
    LOGGER.info("The view/session has expired for user " + (user == null ? "null" : user)); 
    } 

} 

내가 놓친 게 있니?

답변

2

FullAjaxExceptionHandlerFactory 항목을 faces-config.xml에서 제거하십시오. 바로 지금 당신은 기본적으로 2 가지 완전히 별개의 예외 처리기 인스턴스를 가지고 있습니다. 각 인스턴스는 나중에 등록 된 객체가 이전에 등록 된 객체를 래핑하므로 우선 순위가 적용됩니다. 그러나 FullAjaxExceptionHandler 자체는 ajax 예외가 발생하면 랩 된 객체에 위임하지 않습니다.

<factory> 
    <exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory> 
</factory> 
+0

매우 논리와 지금 BalusC 감사합니다 :-) 잘 작동 :

그래서, 당신이 필요로하는 모든 바로 이것이다. – jimmybondy

+0

반갑습니다. – BalusC

+0

또 하나의 질문 : 여기에 설명 된 것처럼 동적 JSF 페이지를 캐시하지 않도록 브라우저에 지시 할 필요가 없다고 가정합니다. http://stackoverflow.com/questions/3642919/javax-faces-application-viewexpiredexception-view-could -not-be-restored/3642969 # 3642969, 맞죠? – jimmybondy