Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

LetsGit.IT/Kategorie/Spring
Springhard

Jak globalnie obsłużyć wyjątki w Spring MVC?

Tagi
#controlleradvice#exceptionhandler#error-handling
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Użyj `@ControllerAdvice` z `@ExceptionHandler`, aby mapować wyjątki na spójne odpowiedzi HTTP (status + body). Dzięki temu kontrolery są czystsze, a obsługa błędów jest w jednym miejscu.

@ControllerAdvice
class ApiErrors {
  @ExceptionHandler(IllegalArgumentException.class)
  ResponseEntity<String> badRequest(IllegalArgumentException e) {
    return ResponseEntity.badRequest().body(e.getMessage());
  }
}

Odpowiedź zaawansowana

Głębiej

Globalna obsługa wyjątków w Spring MVC to najczęściej:

  • `@ControllerAdvice` (dla kontrolerów MVC)
  • `@RestControllerAdvice` (to samo, ale domyślnie zwraca body)

Mapujesz typy wyjątków na odpowiedzi HTTP przez `@ExceptionHandler`. Dla bogatszych odpowiedzi zwracaj `ResponseEntity<?>` (status, header, body) albo użyj `ProblemDetail` w nowszych wersjach Springa.

Co warto ujednolicić

  • Spójny format błędu (np. `errorCode`, `message`, `path`, `correlationId`).
  • Błędy walidacji (`MethodArgumentNotValidException`) → komunikaty per pole.
  • Logowanie oraz mapowanie wyjątków wewnętrznych na bezpieczne komunikaty publiczne.

Przykład

@RestControllerAdvice
class ApiErrors {
  @ExceptionHandler(IllegalArgumentException.class)
  ResponseEntity<ProblemDetail> badRequest(IllegalArgumentException e) {
    var pd = ProblemDetail.forStatus(400);
    pd.setTitle("Bad request");
    pd.setDetail(e.getMessage());
    return ResponseEntity.badRequest().body(pd);
  }
}

Typowe pułapki

  • Wyciek stack trace lub wewnętrznych komunikatów do klienta.
  • Różne formaty błędów w różnych kontrolerach.

Powiązane pytania

Java
Wyjątki Checked vs Unchecked?
#exception#error-handling#java
  • Wszystko jako 500 zamiast sensownych statusów (400/404/409).