GOOGLE ADS

Sonntag, 17. April 2022

Kann ich die Spring-Ausnahmelöser direkt aufrufen?

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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...