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!
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:
Ö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.
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.
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 !!!
Tags und Links java jsf jsf-2 viewexpiredexception