Spring Boot 4-mikrotjänster och REST API:er · Lektion

@ControllerAdvice och @ExceptionHandler

Hantera undantag globalt.

Lektion 3 av 413 steg

@ControllerAdvice och @ExceptionHandler är en gratis lektion i Spring Boot 4-mikrotjänster och REST API:er på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Spring Boot 4-mikrotjänster och REST API:er, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Spring Boot 4-mikrotjänster och REST API:er innehåller totalt 4 lektioner.

Problemet med utspridd try/catch

Om fel hanteras med try/catch i varje controller dupliceras kod och svaren blir inkonsekventa. Spring MVC erbjuder en centraliserad modell: exception handlers som omvandlar undantag till tydliga HTTP-svar.

Lokal @ExceptionHandler

En metod med annotationen @ExceptionHandler i en controller hanterar de angivna undantagstyperna för den controllern. Den mappar ett undantag till ett svar.

@RestController
public class OrderController {
    @ExceptionHandler(OrderNotFoundException.class)
    public ResponseEntity<String> handleNotFound(OrderNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

Gör hanteringen global med @ControllerAdvice

@ControllerAdvice (eller @RestControllerAdvice) innehåller exception handlers som gäller för alla controllers. Det centraliserar felhanteringen i en enda klass.

@RestControllerAdvice
public class GlobalExceptionHandler {
    // handlers shared by every controller
}

Hantera ett domänundantag

Definiera handlers för dina egna undantag och returnera rätt status och en strukturerad body. Samma logik används nu av alla endpoints.

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ApiError notFound(ResourceNotFoundException ex) {
        return new ApiError("NOT_FOUND", ex.getMessage());
    }
}

En konsekvent error DTO

Returnera en enhetlig felstruktur så att klienter kan tolka fel på ett förutsägbart sätt. Inkludera en kod, ett läsbart meddelande och eventuellt en tidsstämpel och fältdetaljer.

public record ApiError(
        String code,
        String message,
        Instant timestamp) {
    public ApiError(String code, String message) {
        this(code, message, Instant.now());
    }
}

Hantera valideringsfel

Fånga MethodArgumentNotValidException för att omvandla Bean Validation-fel till ett tydligt svar med detaljer per fält i stället för Springs standard-body.

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getFieldErrors()
        .forEach(e -> errors.put(e.getField(), e.getDefaultMessage()));
    return errors;
}

En handler som fångar allt

Lägg till en handler för Exception som skyddsnät och returnera 500 med ett generiskt meddelande. Logga framför allt det riktiga undantaget, men läck aldrig stack traces till klienter.

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ApiError handleUnexpected(Exception ex) {
    log.error("Unhandled error", ex);
    return new ApiError("INTERNAL_ERROR", "Something went wrong");
}

Ordningen vid val av handler

Spring väljer den handler vars undantagstyp matchar det kastade undantaget bäst. En handler för OrderNotFoundException går före en för dess superklass, så specifika handlers prioriteras.

Begränsa advice-omfattningen

Du kan begränsa en @ControllerAdvice till specifika paket, annotationer eller controller-typer, så att olika felpolicyer kan användas för exempelvis publika respektive interna API:er.

@RestControllerAdvice(basePackages = "com.example.api.publicapi")
public class PublicApiExceptionHandler { }

Åtkomst till requesten

Handler-metoder kan ta emot extra parametrar som WebRequest eller HttpServletRequest för att komplettera svar med sökvägen eller ett correlation id.

@ExceptionHandler(ResourceNotFoundException.class)
public ApiError notFound(ResourceNotFoundException ex, HttpServletRequest req) {
    return new ApiError("NOT_FOUND", ex.getMessage() + " at " + req.getRequestURI());
}

Säkerhet: dela inte för mycket

Felsvar är en vanlig källa till informationsläckor. Returnera tillräckligt för att klienterna ska kunna agera, men exponera aldrig interna klassnamn, SQL eller stack traces. Logga i stället detaljerna på serversidan.

Snabb kontroll

Testa dina kunskaper om centraliserad felhantering.

Sammanfattning

Centralisera felhanteringen.

  • @ExceptionHandler mappar undantag till svar
  • @ControllerAdvice tillämpar handlers på alla controllers
  • Returnera en konsekvent error DTO
  • Hantera valideringsfel, domänfel och oväntade fel
  • Den mest specifika handlern vinner; läck aldrig intern information till klienter
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
24
Lektioner
93

Vanliga frågor

Är lektionen ”@ControllerAdvice och @ExceptionHandler” gratis?

Ja – hela texten till ”@ControllerAdvice och @ExceptionHandler” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Spring Boot 4-mikrotjänster och REST API:er, kan Ni uppgradera till CoddyKit PRO. Kursen i Spring Boot 4-mikrotjänster och REST API:er innehåller totalt 4 lektioner.

Vad lär jag mig i ”@ControllerAdvice och @ExceptionHandler”?

Hantera undantag globalt. Ni övar på Spring Boot 4-mikrotjänster och REST API:er med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Spring Boot 4-mikrotjänster och REST API:er?

Du behöver inga förkunskaper. Utbildningen i Spring Boot 4-mikrotjänster och REST API:er på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”@ControllerAdvice och @ExceptionHandler”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Spring Boot 4-mikrotjänster och REST API:er-lektionen?

Ja. Varje Spring Boot 4-mikrotjänster och REST API:er-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bean-validering med @Valid
  2. Anpassade validatorer
  3. @ControllerAdvice och @ExceptionHandler
  4. Problemdetaljer (RFC 7807)
← Tillbaka till Spring Boot 4-mikrotjänster och REST API:er