2013-08-01 8 views
6

Po konfrontacji z przerażającym javax.faces.application.ViewExpiredException musiałem rozejrzeć się po Internecie, aby znaleźć właściwe rozwiązanie. Na szczęście rozwiązania są łatwo dostępne i zastosowałem OmniFaces FullAjaxExceptionHandler.Cisza FullAjaxExceptionHandler

Dość powiedziane, jak z prawie wszystkim, od OmniFaces, zadziałało cuda. Ale za każdym razem mam widok upływającym Dostaję:

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. 
... 

Jest to dobre rozwiązanie, ponieważ jest obsługiwany zgodnie z oczekiwaniami, ale jest tam mimo uciszyć ten wyjątek od drukowanego do server.log? To dość szybko tłumi kłody.

Używam:
Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1,6-SNAPSHOT-2013-07-01

na
GlassFish 3.1.2.2

Odpowiedz

6

Zgodnie OmniFaces 1.6, można go rozszerzyć i zastąpić metodę logException() jak poniżej, aby pominąć śledzenie stosu dla 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); 
     } 
    } 

} 

utworzyć fabrykę wokół niego:

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; 
    } 

} 

W celu uzyskania tego uciekać, zarejestrować go jako fabryki w faces-config.xml zwykły sposób (nie zapomnij usunąć oryginalną rejestrację FullAjaxExceptionHandlerFactory) :

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

Dobry panie, jesteś dżentelmenem i uczonym! Wielkie dzięki. – blo0p3r

+0

@ BalusC brakuje przełącznika w 'MyAjaxExceptionHandler # logException'. Ta linia musi znajdować się wewnątrz else: 'super.logException (kontekst, wyjątek, lokalizacja, komunikat, parametry);'. Ponadto, jeśli się nie mylę, face-config.xml '' musi być com.example.MyAjaxExceptionHandlerFactory. –

+0

@Patrick: odpowiedź została zaktualizowana. Dzięki! – BalusC