JSF: ViewExpiredException kann nicht abgefangen werden

8

Ich entwickle eine JSF 2.0-Anwendung auf Glassfish v3 und versuche, die ViewExpiredException zu behandeln. Aber was auch immer ich mache, ich bekomme immer einen Glassfish-Fehlerbericht anstelle meiner eigenen Fehlerseite.

Um das Auftreten der VEE zu simulieren, habe ich die folgende Funktion in meine Backing-Bean eingefügt, die die VEE abfeuert. Ich trigse diese Funktion von meiner JSF Seite durch einen commandLink aus. Der Code:

%Vor%

Zuerst habe ich es versucht, indem ich einfach eine Fehlerseite zu meiner web.xml hinzufüge:

%Vor%

Aber das funktioniert nicht, ich werde nicht zum Fehler umgeleitet, aber mir wird die Glassfish Fehlerseite angezeigt, die eine HTTP Status 500 Seite mit dem folgenden Inhalt zeigt:

%Vor%

Als nächstes habe ich versucht, ExceptionHandlerFactory und einen CustomExceptionHandler zu schreiben, wie in JavaServerFaces 2.0 - The Complete Reference beschrieben. Also habe ich das folgende Tag in faces-config.xml eingefügt:

%Vor%

Und diese Klassen hinzugefügt: Die Fabrik:

%Vor%

Der benutzerdefinierte Ausnahmebehandler:

%Vor%

Aber ich bin noch nicht auf meine Fehlerseite weitergeleitet - ich bekomme den gleichen HTTP 500 Fehler wie oben. Was mache ich falsch, was könnte in meiner Implementierung fehlen, dass die Ausnahme nicht korrekt behandelt wird? Jede Hilfe wird sehr geschätzt!

BEARBEITEN

Ok, ich bin ehrlich. Tatsächlich ist mein Code tatsächlich in Scala geschrieben, aber das ist eine lange Geschichte. Ich dachte, es war die ganze Zeit ein Java-Problem. Der ECHTE Fehler in diesem Fall war meine eigene Dummheit. In meinem (Scala) Code, in CustomExceptionHandler, habe ich vergessen, die Zeile mit dem "i.remove ();" Die ViewExpiredException blieb also nach der Behandlung in der UnhandledExceptionsQueue und wurde "aufgepumpt". Und wenn es aufbläht, wird es eine ServletException.

Es tut mir wirklich leid, Sie beide zu verwirren!

    
ifischer 05.06.2010, 14:20
quelle

2 Antworten

14

Dieser Testfall ist falsch. Das ViewExpiredException wird normalerweise nur beim Wiederherstellen der Ansicht (weil es in der Sitzung fehlt), nicht beim Rendern der Antwort oder beim Instanziieren der Bean geworfen. In Ihrem Fall wird diese Ausnahme beim Instanziieren der Bean ausgelöst und diese Ausnahme wurde in ein ServletException eingeschlossen.

Das real ViewExpiredException wird normalerweise nur ausgelöst, wenn Sie eine HTTP-POST-Anforderung an den Server senden, während die HTTP-Sitzung abgelaufen ist. Es gibt also grundsätzlich zwei Möglichkeiten, dies zuverlässig zu reproduzieren:

  1. Öffnen Sie eine JSF-Seite mit einem POST-Formular ( h:form ist standardmäßig bereits POST) in einem Webbrowser, schließen Sie den Server und bereinigen Sie das Arbeitsverzeichnis (wichtig, weil die meisten Server geöffnete Sitzungen beim Herunterfahren serialisieren) und die Serialisierung beim Start durchführen), starten Sie den Server neu und senden Sie das bereits geöffnete Formular. Ein ViewExpiredException wird geworfen.

  2. Legen Sie die <session-timeout> in web.xml auf 1 minute fest und senden Sie das Formular mehr als 1 Minute nach dem Öffnen der JSF-Seite mit dem POST-Formular ab. Dies wird auch ViewExpiredException ausgeben.

BalusC 05.06.2010, 22:29
quelle
2

Ich bin kein Experte. Dies sind nur wilde Vermutungen oder Vorschläge.

1) Versuchen Sie, auf eine Standard-HTML-Seite umzuleiten, um zu sehen, ob das funktioniert 2) Darauf basierend sollte es funktionieren Der erste Ansatz selbst, versuchen Sie, einen JSF PhaseListener zu schreiben und die gleiche Ausnahme in der RESTORE VIEW Phase.Right zu werfen, werfen Sie jetzt entweder in die INVOKE APPLICATION oder UPDATE MODEL Phase. 3) Stellen Sie durch einen Sysout sicher, dass die Fehlerseite konfiguriert ist - Servlet Context verwenden (Ich habe dies nicht versucht, aber es sollte möglich sein)

Auch ich bin gespannt was das Problem sein könnte !!!

    
gekrish 05.06.2010 14:51
quelle