2013-08-01 10 views
6

Nachdem ich mit dem gefürchteten javax.faces.application.ViewExpiredException konfrontiert wurde, musste ich mich im Internet umsehen, um die richtige Lösung zu finden. Zum Glück sind die Lösungen leicht verfügbar und ich ging voran und nahm die OmniFaces FullAjaxExceptionHandler.Silence FullAjaxExceptionHandler

Genug gesagt, wie bei so ziemlich allem von OmniFaces, hat es Wunder gewirkt. Aber habe jedes Mal, wenn ich eine Ansicht auslaufenden erhalte ich:

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

Das ist in Ordnung, da es wie erwartet abgewickelt wird, aber ist es trotzdem, diese Ausnahme zu Schweigen von zum server.log gedruckt werden? Dies würde das Protokoll ziemlich schnell überladen.

Ich betreibe:
Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013-07-01

auf
Glassfish 3.1.2.2

Antwort

6

Per OmniFaces 1.6 können Sie es erweitern und überschreiben Sie die Methode logException() wie unten, um den Stack-Trace für ViewExpiredException zu überspringen.

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

} 

erstellen Fabrik drum herum:

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

} 

Um führen diese zu erhalten, registrieren Sie es als Fabrik in faces-config.xml die übliche Art und Weise (nicht zu vergessen die ursprüngliche Anmeldung für FullAjaxExceptionHandlerFactory zu entfernen) :

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

Sie guten Herrn sind ein Gentleman und ein Gelehrter! Danke vielmals. – blo0p3r

+0

@BalusC ein Schalter fehlt in 'MyAjaxExceptionHandler # logException'. Diese Zeile muss innerhalb der else sein: 'super.logException (Kontext, Ausnahme, Ort, Nachricht, Parameter);'. Wenn ich mich nicht irre, muss faces-config.xml '' com.example.MyAjaxExceptionHandlerFactory sein. –

+0

@Patrick: Antwort wurde aktualisiert. Vielen Dank! – BalusC