Mein Servlet-Anforderungs-Thread ruft einen Worker-Thread auf, der Ausnahmen vieler möglicher Typen auslösen kann. Der Worker-Thread fängt jede Ausnahme ab und gibt sie an den Anforderungs-Thread zurück. Ich möchte diese Ausnahme für die richtige Handler-Methode in meinem Spring-Controller erhalten.
Sie können eine Ausnahme von einem Thread nicht in einem anderen Thread erneut auslösen, daher umschließt der Anforderungsthread die ursprüngliche Ausnahme und löst diese aus. Diese Wrapper-Ausnahme wird derzeit von einer Catch-All-Controller-Methode behandelt, die mit annotiert ist @ExceptionHandler(Throwable.class)
. Da dieser Handler vorhanden ist, betrachtet Spring die verschachtelte Ausnahme nicht, sodass die verschachtelte Ausnahme ignoriert wird.
Ich kann einen Handler für den Wrapper-Ausnahmetyp hinzufügen. Darin möchte ich die verschachtelte Ausnahme auspacken und Spring bitten, sie an den richtigen Handler weiterzuleiten. Ich habe gelernt, dass Spring Ausnahmen über eine Kette von Resolvern behandelt, die HandlerExceptionResolver
. Gibt es eine Möglichkeit, diese Kette direkt von meinem Handler aus aufzurufen?
Lösung des Problems
Ihr @ControllerAdvice
, der die Ausnahmen behandelt, ist auch eine Bohne. Sie können es in andere Beans injizieren, einschließlich Ihres Controllers. Sie können also Methoden des Ausnahmebehandlers direkt aufrufen. Dann kann Ihr Controller alles zurückgeben, was der Ausnahmehandler zurückgegeben hat:
@GetMapping(...)
ResponseEntity controller() {
...
SomeException e =...;
return exceptionHandler.handle(e);
}
Damit dies funktioniert, sollten Sie keine Anmerkungen wie @ResponseStatus(NOT_FOUND)
im Ausnahmehandler verwenden. Stattdessen sollten Sie ResponseEntity
- set it all up und return von der Exception-Handler-Methode verwenden.
Keine Kommentare:
Kommentar veröffentlichen