0Pricing
Java Academy · Lektion

Globale Ausnahmebehandlung mit @ControllerAdvice

Zentralisieren Sie die Ausnahmebehandlung über alle Controller hinweg mit @ExceptionHandler und @ControllerAdvice.

Globale Ausnahmebehandlung mit @ControllerAdvice ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Das Problem ohne globale Fehlerbehandlung

Ohne globale Ausnahmebehandlung benötigt jede Controller-Methode try-catch-Blöcke, der Aufbau von Fehlerantworten wird dupliziert und Ausnahmedetails gelangen an die Clients.

@ControllerAdvice und @RestControllerAdvice

@ControllerAdvice definiert eine Klasse zur globalen Ausnahmebehandlung. @RestControllerAdvice fügt @ResponseBody hinzu, sodass alle Handler-Methoden automatisch JSON zurückgeben.

@RestControllerAdvice
public class GlobalExceptionHandler {
    // @ExceptionHandler methods go here
}

@ExceptionHandler-Methoden

Annotieren Sie eine Methode mit @ExceptionHandler(ExceptionType.class). Spring leitet Ausnahmen dieses Typs (und seiner Unterklassen) an die Methode weiter. Geben Sie ein ResponseEntity mit dem passenden Status zurück.

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND)
        .body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}

Mehrere Ausnahmetypen behandeln

Geben Sie mehrere Ausnahmetypen in einem Handler an oder verwenden Sie eine gemeinsame Basisklasse. Spring wählt den spezifischsten verfügbaren Handler aus.

@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
    return ResponseEntity.badRequest()
        .body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}

Validierungsfehler behandeln

Fangen Sie MethodArgumentNotValidException ab, um Feldfehler aus Request-Bodys zu extrahieren, die mit @Valid validiert wurden.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> fieldErrors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        fieldErrors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest()
        .body(Map.of("errors", fieldErrors, "status", 400));
}

Constraint-Verstöße behandeln

ConstraintViolationException wird ausgelöst, wenn Methodenparameter auf der Service-Ebene mit @Validated validiert werden. Behandeln Sie diese Ausnahme getrennt von MVC-Validierungsfehlern.

@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<Map<String, String>> handleConstraint(ConstraintViolationException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getConstraintViolations().forEach(v ->
        errors.put(v.getPropertyPath().toString(), v.getMessage()));
    return ResponseEntity.badRequest().body(errors);
}

Zugriff auf HttpServletRequest

Fügen Sie HttpServletRequest als Parameter hinzu, um Request-Details (URL, Methode, Header) für die Protokollierung oder die Aufnahme in die Fehlerantwort abzurufen.

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
    log.error("Unhandled error on {} {}", req.getMethod(), req.getRequestURI(), ex);
    return ResponseEntity.internalServerError()
        .body(new ErrorResponse("INTERNAL_ERROR", "Unexpected error"));
}

@ResponseStatus auf Ausnahme-Klassen

Annotieren Sie benutzerdefinierte Ausnahme-Klassen mit @ResponseStatus, um den HTTP-Status automatisch ohne eine Handler-Methode zu setzen – für einfache Fälle ist das die unkompliziertere Lösung.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String msg) { super(msg); }
}

@ControllerAdvice einschränken

Beschränken Sie die Advice mithilfe der Attribute von @ControllerAdvice auf bestimmte Pakete, Annotationen oder Basisklassen.

@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }

Protokollierung in Ausnahme-Handlern

Protokollieren Sie Ausnahmen auf der passenden Stufe: Benutzerfehler (4xx) mit WARN, unerwartete Fehler (5xx) mit ERROR und dem vollständigen Stacktrace.

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex, HttpServletRequest req) {
    if (ex instanceof BusinessException) log.warn("Business error: {}", ex.getMessage());
    else log.error("Unexpected error on {}", req.getRequestURI(), ex);
    return ...
}

Priorität von Exception-Handlern

Spring wählt den spezifischsten Handler. Wenn ResourceNotFoundException extends RuntimeException gilt, hat ein Handler für ResourceNotFoundException Vorrang vor einem für RuntimeException.

Kurzer Test

Welche Annotation kennzeichnet eine Methode, die global einen bestimmten Exception-Typ behandelt?

Zusammenfassung

Verwenden Sie @RestControllerAdvice und @ExceptionHandler, um die Fehlerbehandlung zu zentralisieren. Geben Sie ResponseEntity mit einer konsistenten Fehlerstruktur zurück. Behandeln Sie Validierungsfehler (MethodArgumentNotValidException) und Constraint-Verletzungen (ConstraintViolationException) getrennt. Protokollieren Sie 4xx-Fehler als WARN und 5xx-Fehler als ERROR.

Häufig gestellte Fragen

Ist die Lektion „Globale Ausnahmebehandlung mit @ControllerAdvice“ kostenlos?

Ja — der vollständige Text von „Globale Ausnahmebehandlung mit @ControllerAdvice“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Globale Ausnahmebehandlung mit @ControllerAdvice“?

Zentralisieren Sie die Ausnahmebehandlung über alle Controller hinweg mit @ExceptionHandler und @ControllerAdvice. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Globale Ausnahmebehandlung mit @ControllerAdvice“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Bean Validation: @NotNull, @Size, @Pattern
  2. Eigene Constraint-Annotationen
  3. Globale Ausnahmebehandlung mit @ControllerAdvice
  4. RFC 7807 Problem Details und konsistente Fehlerantworten
← Zurück zu Java Academy