Spring Exceptions
Obsługiwanie wyjątków¶
Tworzymy własny wyjątek i własną klasę DTO, która będzie przesyłana klientowi. Przykładowo:
class StudentNotFoundException extends RunTimeException {}
class StudentErrorResponse {
int status;
String message;
Timestamp timestamp;
}
W celu zarejestrowania obsługi wyjątku tworzymy funkcję z adnotacją @ExceptionHandler
:
@ExceptionHandler
ResponseEntity<StudentErrorResponse> handleStudentNotFoundException(StudentNotFoundException ex) {
StudentErrorResponse error = new StudentErrorResponse()
error.setStatus(HttpStatus.NOT_FOUND.value());
...
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
Funkcje handlujące można dodawać wewnątrz kontrolerów - wtedy to jest ich zakres.
Globalna obsługa wyjątków¶
Gdy potrzebujemy obsługiwać błąd dla wielu kontrolerów, możemy stworzyć globalną obsługę wyjątku. Taką funkcję obsługującą umieszczamy wewnątrz klasy, oznaczonej adnotacją ControllerAdvice
. Przykładowo:
Obsługa błędów przy walidacji¶
W przypadku używania adnotacji np. @NotBlank, @NotEmpty(message = ...), @Min
, jeśli zapytanie nie spełnia wymagań, zostanie rzucony błąd:
MethodArgumentNotValidException
- dla ciała żadania z adnotacją@RequestBody
ConstraintViolationException
- dla parametrów z walidacją na poziomie metod lub query params.
Trzeba je przechwywić w globalnym handlerze wyjątków. Przykładowo: