Wie umgehe ich Fehler Staaten in servlet-filtern, ohne dass der Benutzer einen stack-trace?
Arbeite ich an einem Steg/RESTEasy-app. Wenn ich werfe einen WebApplicationException(myResponse)
von einem meiner REST-Endpunkte, sendet er die gegebene Antwort an den client.
Wenn ein filter einen Fehler erkennt, ich will das gleiche Verhalten:
- Sie sollten aufhören, die Ausführung von Verfahren, und
- Sollte es Sie geben dem Anwender eine klare, JSON-Fehler, die nicht durch einen stack-trace.
Offensichtlich, gerade beim schreiben der Antwort-stream und return
ing arbeitet innerhalb der doFilter
Methode. Aber dies funktioniert nicht für andere Methoden aufgerufen doFilter
.
Werfen einer Ausnahme entsprechen wird Bedingung #1, aber ich habe nicht herausgefunden, eine vernünftige Weise zu erfüllen, Bedingung #2 dann. (Sie können sehen, meine beste Versuch an der Unterseite.)
Als Wahrnehmung erklärt in seiner Antwort, WebApplicationException
s behandelt werden wie jeder andere Ausnahme, die im Kontext eines Filters, und damit geben Sie dem Benutzer eine schön hässliche stack-trace.
Also zusammenfassend meine Fragen:
- Tun serveltt Container haben eine gleichwertige zu
throw new WebApplicationException(Response)
? - Und vielleicht noch wichtiger ist, wie gehen andere java-Projekte?
Ich habe diesen code in ein filter und es funktioniert, aber ich würde lieber eine elegante Lösung, die automatisch für alle Filter:
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
try {
doFilterOrThrow(request, response, chain);
} catch (WebApplicationException e) {
Response res = e.getResponse();
((HttpServletResponse) response).sendError(res.getStatus(), (String) res.getEntity());
}
}
InformationsquelleAutor Nathan Friedly | 2013-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die spezifische Behandlung, die Sie erwähnen, für die web-Anwendung von Ausnahmen ist nur definiert im Rahmen der JAX-RS container, die durch die Art und Weise, ist nicht das gleiche wie ein Servlet-container.
Web-Filter werden von der Servlet-container, die nicht wissen oder sich darum kümmern, dass eine JAX-RS container existiert innerhalb der gleichen application server. Es auch nicht wissen, oder kümmern uns um die web-Anwendung Ausnahmen. So, wenn Sie werfen Sie die WAE aus der filter so behandelt, genauso wie alle anderen Ausnahme (server-Fehler mit einem stack-trace, oder eine vorkonfigurierte Fehler-Seite, wenn Sie eins eingerichtet in Ihrer web-Anwendung).
Mir scheint, wenn Sie auf einen Fehler an den client konnte man einfach so aus dem filter, indem Sie sich schriftlich direkt an den response-stream. Aber wenn Sie versuchen, Sie zu nutzen, einige bestehende JAX-RS-Logik dann ein (RESTEasy bestimmte) Lösung wäre die Flagge der Antrag als Fehler addiert sich in deinem filter erzeugt dann eine WAE in JAX-RS, mit einer provider-Klasse. Beispiel:
Da der Anbieter existiert in JAX-RS land, die web-Anwendung Ausnahme ist verarbeitet nach den Regeln von Abschnitt 3.3.4 der JAX-RS-Spezifikation, und Sie erhalten die gewünschte Reaktion auf der client-Seite.
* EDIT:*
In der unteren Zeile ist, gibt es keine standard-Java-EE vorgeschriebenen Weise (derzeit) zu behandeln servlet-Ausnahmen in einer zentralisierten Weise ähnlich zu dem, was verfügbar ist in der JAX-RS. Da Sie mithilfe von JBoss/RestEASY, aber Sie könnten nutzen die JBoss Naht Fangen Bibliothek zu bekommen ziemlich nahe.
Die oben zeigt ein Ausnahme-handler, wie beschrieben in der Naht Fangen Dokumentation. Beachten Sie, dass die Bibliothek in massiver flux jetzt, so dass Sie wollen, nutzen Sie nur als letzten Ausweg.
return
von derdoFilter()
Methode, aber das funktioniert nicht, wenn der Fehler-Zustand wird erkannt und einige andere Methode, diedoFilter()
Anrufe. (Zumindest nicht ohne zusätzliche Logik...)Wenn Sie brauchen, um zu stoppen Verarbeitung sofort dann sind Sie im Grunde brauchen, um sich zu vermehren, in den filter, der Daten, würde zurückgegeben wurde, durch die JAX-RS. Es gibt einfach keinen anderen Weg, um, dass, da die Filter nicht ausgeführt, in der JAX-RS container (sondern vor). Eine weitere option wäre die Umsetzung in Ihre filter-Logik in der pre-Prozess-interceptor, obwohl ich das Gefühl habe, dass es intermediate Filter und Prozesse, die Sie versuchen zu überspringen Weise vor, daß Punkt.
Gibt es eine Möglichkeit zum einrichten einer generischen Fehlerhandler für auftretende Fehler in der servlet-container, auch in den Filter? - Tatsächlich, ich denke, das könnte was ich brauche: stackoverflow.com/questions/4207586/...
Jedenfalls, ich glaube nicht, dass ich werde erhalten eine bessere Antwort, so erhalten Sie die bounty 🙂
Ich habe einige Informationen auf der Naht zu Fangen, das ist eine Bibliothek, die es zumindest ermöglicht die zentrale Abwicklung von nicht abgefangene Ausnahmen. Es erfordert einige hantieren um zu arbeiten, und natürlich Sie tun müssen, wird die JSON-mapping selbst, aber es ist ein solider start zumindest.
InformationsquelleAutor Perception