Jersey ... wie man alle Ausnahmen protokolliert, aber ExceptionMappers aufruft

7

Ich bin in ein bisschen Binden ... will meinen Kuchen und es auch essen.

Ich möchte alle Ausnahmen protokollieren, die meine Anwendung auslöst. Wenn also jemand eine falsche URL trifft, möchte ich den Stack-Trace auf SLF4J protokollieren.

Also denkst du wahrscheinlich, "hey, das ist einfach, implementiere einfach einen Exceptionmapper und melde die Ausnahme." Also tat ich:

%Vor%

Wenn Sie dies tun, erhalten Sie anstelle von 404 Fehlern, wenn jemand eine falsche URL eingibt, einen 500 Fehler. Man würde vermuten, dass das Zurückgeben von null die Ausnahme in den Kettenhandlern weitergibt, aber Jersey macht das nicht. Es bietet tatsächlich sehr wenig Informationen, warum es einen Handler über einen anderen wählen würde ...

Ist jemand auf dieses Problem gestoßen und wie haben Sie es gelöst?

    
Jonathan S. Fisher 13.04.2014, 20:42
quelle

2 Antworten

6

Um den korrekten http-Statuscode zurückzugeben, könnte Ihr Exception Mapper etwa so aussehen:

%Vor%

Es klingt auch so, als ob Sie an kaskadierenden Exception Mappern interessiert sind, aber laut Spezifikation ist das nicht möglich:

JAX-RS 2.0 Spezifikation, Kapitel 4.4

"Ausnahmezuordnungsanbieter ordnen einer Instanz von Response eine Überprüfungs- oder Laufzeitausnahme zu. Eine Ausnahme Mapping-Provider implementiert die ExceptionMapper-Schnittstelle und kann mit Anmerkungen versehen werden @Provider für automatische Erkennung. Wenn Sie einen Ausnahmezuordnungsanbieter zum Zuordnen einer Ausnahme auswählen, Eine Implementierung MUSS den Provider verwenden, dessen generischer Typ die nächste Oberklasse der Ausnahme ist.

Wenn eine Ressourcenklasse oder eine Provider-Methode eine Ausnahme auslöst, für die eine Ausnahmezuordnung existiert Provider wird der passende Provider verwendet, um eine Response-Instanz zu erhalten. Die resultierende Antwort wird verarbeitet als ob eine Web-Ressourcen-Methode die Antwort zurückgegeben hätte, siehe Abschnitt 3.3.3. Insbesondere ein zugeordnetes Die Antwort MUSS mit der in Kapitel 6 definierten ContainerResponse-Filterkette verarbeitet werden.

Um eine potentiell unendliche Schleife zu vermeiden, muss während der Verarbeitung von a ein einzelner Exception Mapper verwendet werden Anfrage und die entsprechende Antwort. JAX-RS-Implementierungen dürfen NICHT versuchen, Ausnahmen zuzuordnen Wird während der Verarbeitung einer zuvor von einer Ausnahme gemappten Antwort ausgelöst. Stattdessen muss diese Ausnahme MUSS verarbeitet werden, wie in den Schritten 3 und 4 in Abschnitt 3.3.4 beschrieben. "

    
Alden 14.04.2014, 02:52
quelle
20

Sie können einen RequestEventListener verwenden, um auf ein Ausnahmeereignis zu warten und das Array throwable ohne zu protokollieren Beeinträchtigung der bestehenden Verarbeitung. Beachten Sie, dass zuerst ein ApplicationEventListener registriert wird, das dann eine Instanz von RequestEventListener zurückgibt.

%Vor%     
Adrian Baker 22.10.2015 01:01
quelle

Tags und Links