Gestione globale delle eccezioni con @ControllerAdvice
Centralizzi la gestione delle eccezioni in tutti i controller con @ExceptionHandler e @ControllerAdvice.
Gestione globale delle eccezioni con @ControllerAdvice è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Il problema senza una gestione globale
Senza una gestione globale delle eccezioni, ogni metodo del controller richiede blocchi try-catch, la creazione delle risposte di errore viene duplicata e i dettagli delle eccezioni possono essere esposti ai client.
@ControllerAdvice e @RestControllerAdvice
@ControllerAdvice definisce una classe globale per la gestione delle eccezioni. @RestControllerAdvice aggiunge @ResponseBody, così tutti i metodi di gestione restituiscono automaticamente JSON.
@RestControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler methods go here
}Metodi @ExceptionHandler
Annoti un metodo con @ExceptionHandler(ExceptionType.class). Spring indirizza al metodo le eccezioni di quel tipo e delle relative sottoclassi. Restituisca una ResponseEntity con lo stato appropriato.
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}Gestione di più tipi di eccezione
Indichi più tipi di eccezione in un unico handler oppure utilizzi una classe base comune. Spring sceglie l'handler più specifico disponibile.
@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}Gestione degli errori di validazione
Gestisca MethodArgumentNotValidException per estrarre gli errori a livello di campo dai body delle richieste validati con @Valid.
@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));
}Gestione delle violazioni dei vincoli
ConstraintViolationException viene generata quando i parametri dei metodi vengono validati con @Validated a livello di service. La gestisca separatamente dagli errori di validazione MVC.
@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);
}Accesso a HttpServletRequest
Aggiunga HttpServletRequest come parametro per ottenere i dettagli della richiesta (URL, metodo e header) da utilizzare nei log o da includere nella risposta di errore.
@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 sulle classi delle eccezioni
Annoti le classi delle eccezioni personalizzate con @ResponseStatus per impostare automaticamente lo stato HTTP senza un metodo handler, una soluzione più semplice nei casi immediati.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String msg) { super(msg); }
}Limitazione dell'ambito di @ControllerAdvice
Limiti l'advice a pacchetti, annotazioni o classi base specifici utilizzando gli attributi di @ControllerAdvice.
@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }Logging nei gestori delle eccezioni
Registri le eccezioni al livello appropriato: gli errori dell'utente (4xx) a livello WARN, gli errori imprevisti (5xx) a livello ERROR con l'intero stack trace.
@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à dei gestori delle eccezioni
Spring seleziona il gestore più specifico. Se ResourceNotFoundException extends RuntimeException, un gestore per ResourceNotFoundException ha la precedenza su uno per RuntimeException.
Verifica rapida
Quale annotazione contrassegna un metodo per gestire globalmente un tipo specifico di eccezione?
Riepilogo
Utilizzi @RestControllerAdvice + @ExceptionHandler per centralizzare la gestione degli errori. Restituisca un ResponseEntity con una struttura degli errori coerente. Gestisca separatamente la validazione (MethodArgumentNotValidException) e i vincoli (ConstraintViolationException). Registri gli errori 4xx come WARN e quelli 5xx come ERROR.
Domande Frequenti
La lezione «Gestione globale delle eccezioni con @ControllerAdvice» è gratuita?
Sì — il testo completo di «Gestione globale delle eccezioni con @ControllerAdvice» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Gestione globale delle eccezioni con @ControllerAdvice»?
Centralizzi la gestione delle eccezioni in tutti i controller con @ExceptionHandler e @ControllerAdvice. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Gestione globale delle eccezioni con @ControllerAdvice»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Validazione dei bean: @NotNull, @Size, @Pattern
- Annotazioni di vincoli personalizzate
- Gestione globale delle eccezioni con @ControllerAdvice
- Problem Details RFC 7807 e risposte di errore coerenti