@ControllerAdvice og @ExceptionHandler
Håndtér exceptions globalt.
@ControllerAdvice og @ExceptionHandler er en gratis Spring Boot 4-mikrotjenester og REST-API'er-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Spring Boot 4-mikrotjenester og REST-API'er, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 4 lektioner i alt.
Problemet med spredt try/catch
Håndtering af fejl med try/catch i hver controller duplikerer kode og giver inkonsistente svar. Spring MVC tilbyder en centraliseret model: undtagelseshåndterere, der omdanner undtagelser til rene HTTP-svar.
Lokal @ExceptionHandler
En metode med annoteringen @ExceptionHandler inde i en controller håndterer de angivne undtagelsestyper for den pågældende controller. Den knytter en undtagelse til et 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 håndteringen global med @ControllerAdvice
@ControllerAdvice (eller @RestControllerAdvice) indeholder undtagelseshåndterere, der gælder på tværs af alle controllere. Det centraliserer fejlhåndteringen i én klasse.
@RestControllerAdvice
public class GlobalExceptionHandler {
// handlers shared by every controller
}Håndtering af en domæneundtagelse
Definér håndterere til dine egne undtagelser, og returnér den rigtige status og et struktureret legeme. Den samme logik betjener nu alle slutpunkter.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ApiError notFound(ResourceNotFoundException ex) {
return new ApiError("NOT_FOUND", ex.getMessage());
}
}En ensartet fejl-DTO
Returnér en ensartet fejlstruktur, så klienter kan fortolke fejl forudsigeligt. Medtag en kode, en menneskeligt læsbar meddelelse og eventuelt et tidsstempel og feltdetaljer.
public record ApiError(
String code,
String message,
Instant timestamp) {
public ApiError(String code, String message) {
this(code, message, Instant.now());
}
}Håndtering af valideringsfejl
Fang MethodArgumentNotValidException for at omdanne Bean Validation-fejl til et tydeligt svar felt for felt i stedet for Springs standardlegeme.
@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 universalhåndterer
Tilføj en håndterer for Exception som sikkerhedsnet, og returnér 500 med en generisk meddelelse. Log afgørende nok den faktiske undtagelse, men afslør aldrig stakspor over for 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");
}Rækkefølge for valg af håndterer
Spring vælger den håndterer, hvis undtagelsestype passer bedst til den udløste undtagelse. En håndterer for OrderNotFoundException vinder over en for dens superklasse, så specifikke håndterere har prioritet.
Begrænsning af advice
Du kan begrænse en @ControllerAdvice til bestemte pakker, annoteringer eller controllertyper, så forskellige fejlpolitikker kan bruges til f.eks. offentlige og interne API'er.
@RestControllerAdvice(basePackages = "com.example.api.publicapi")
public class PublicApiExceptionHandler { }Adgang til forespørgslen
Håndterermetoder kan modtage ekstra parametre som WebRequest eller HttpServletRequest for at berige svar med stien eller et korrelations-id.
@ExceptionHandler(ResourceNotFoundException.class)
public ApiError notFound(ResourceNotFoundException ex, HttpServletRequest req) {
return new ApiError("NOT_FOUND", ex.getMessage() + " at " + req.getRequestURI());
}Sikkerhed: Del ikke for meget
Fejlsvar er en almindelig kilde til informationslækager. Returnér nok til, at klienter kan handle, men eksponér aldrig interne klassenavne, SQL eller stakspor. Log i stedet detaljerne på serversiden.
Hurtig kontrol
Test din forståelse af centraliseret håndtering.
Opsummering
Centralisér fejlhåndteringen.
@ExceptionHandlerknytter undtagelser til svar@ControllerAdviceanvender håndterere på tværs af alle controllere- Returnér en ensartet fejl-DTO
- Håndtér validerings-, domæne- og universaltilfælde
- Den mest specifikke håndterer vinder; læk aldrig interne oplysninger til klienter
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 24
- Lektioner
- 93
Ofte stillede spørgsmål
Er lektionen “@ControllerAdvice og @ExceptionHandler” gratis?
Ja — hele teksten til “@ControllerAdvice og @ExceptionHandler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Spring Boot 4-mikrotjenester og REST-API'er-kurset, skal du opgradere til CoddyKit PRO. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “@ControllerAdvice og @ExceptionHandler”?
Håndtér exceptions globalt. Du øver dig i Spring Boot 4-mikrotjenester og REST-API'er med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Spring Boot 4-mikrotjenester og REST-API'er?
Der kræves ingen tidligere erfaring. Spring Boot 4-mikrotjenester og REST-API'er på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “@ControllerAdvice og @ExceptionHandler”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Spring Boot 4-mikrotjenester og REST-API'er-lektion?
Ja. Alle Spring Boot 4-mikrotjenester og REST-API'er-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Bean-validering med @Valid
- Brugerdefinerede validatorer
- @ControllerAdvice og @ExceptionHandler
- Problem Details (RFC 7807)