-
Notifications
You must be signed in to change notification settings - Fork 2
Tag 27 Exception Handling
Wird bei einem Request eine Exception geschmissen, leitet Spring Boot die Exception als „Internal Server Error“ mit dem Status 500 an das Frontend weiter. Dies wird über folgenden Code abgebildet:
Im Controller wird eine ungültige ID übergeben:
Dadurch wird im Service die Exception ausgelöst:
Der Response lässt aber nicht auf die tatsächliche Ursache schließen:
Es gibt drei Möglichkeiten, den Response zu manipulieren.
Mit der ResponseStatusException kann der Response verändert werden. Dazu stehen 3 verschiedene Konstruktoren zur Verfügung.
Um nur den http-Status zu setzen:
ResponseStatusException(HttpStatus)
Um den http-Status und die Nachricht zu setzen:
ResponseStatusException(HttpStatus, Nachricht)
Um den http-Status, die Nachricht und die verursachende Exception zu setzen:
ResponseStatusException(HttpStatus, Nachricht, Exception)
Dank des Try – Catch Blocks wird die NoSuchElementException gefangen, falls die ID nicht im Repo / in der DB existiert. Es kann dann ein passender http-Status übergeben werden. Auch die Fehlernachricht kann mit angegeben werden:
Die Response verfügt nun über den korrekten Status und den passenden Error. Die Fehlernachricht wird aber nicht angezeigt:
Mit einer ResponesEntity kann eine Response zurückgegeben werden, welche sowohl den http-Status, als auch den Return Value hält. Es stehen mehrere Konstruktoren zur Verfügung. Im folgendem wird nur auf zwei eingegangen.
Dieser Konstruktor nimmt nur den http-Status entgegen
ResponseEntity(HttpStatus)
Dieser Konstruktor nimmt den http-Status und einen Body, der einem bestimmten Typs entspricht, entgegen
ResponseEntity(Body, HttpStatus)
Im Try wird bei Erfolg das gefundene Todo als Body zurückgegeben. Im Fehlerfall kann nur der Status angepasst werden, da dein Todo existiert:
Der Status wurde entsprechend gesetzt, der Body bleibt leer:
In dieser Variante wird dank einer Annotation die in einem Controller auftretende Exception an eine extra Klasse weitergeleitet. Symbolhaft nachfolgend skizziert:
Zunächst wird die GlobalExceptionHandler Klasse mit der @ControllerAdvice Annotation erstellt. Dadurch wird eine Exception, die bisher im Controller gecatched wurde an diese Klasse weitergeleitet.
Dann wird eine Methode geschrieben, welche die @ExceptionsHandler Annotation besitzt. In dieser wird die Exception, die durch diese Methode behandet werden soll, angegeben:
In der Methode kann nun noch ein Error-Typ angelegt werden. Hierzu wird ein Record angelegt. Die Message kann z.B. der Fehlernachricht der Exception entsprechen.
Dieser Record soll als Body der Response verwendet werden. Hierzu muss der Error als Typ der ResponsEntity angegeben werden:
public ResponseEntity<BodyType> handleNoSuchElementException(NoSuchElementException e)
Dann wird der ApiError erzeugt und als Body der ResponseEntity übergeben:
Die Methode im Controller kann dafür sehr sauber und simpel bleiben:
Die Response erhält sowohl den korrekten http-Status, als auch die Fehlermeldung der verursachenden Exception: