Gestion globale des exceptions avec @ControllerAdvice
Centralisez la gestion des exceptions dans tous les contrôleurs avec @ExceptionHandler et @ControllerAdvice.
Gestion globale des exceptions avec @ControllerAdvice est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Le problème en l’absence de gestion globale
Sans gestion globale des exceptions, chaque méthode de contrôleur a besoin de blocs try-catch, la construction des réponses d’erreur est dupliquée et les détails des exceptions sont divulgués aux clients.
@ControllerAdvice et @RestControllerAdvice
@ControllerAdvice définit une classe de gestion globale des exceptions. @RestControllerAdvice ajoute @ResponseBody afin que toutes les méthodes de gestion renvoient automatiquement du JSON.
@RestControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler methods go here
}Méthodes @ExceptionHandler
Annotez une méthode avec @ExceptionHandler(ExceptionType.class). Spring achemine vers cette méthode les exceptions de ce type et de ses sous-types. Renvoyez un ResponseEntity avec le statut approprié.
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}Gérer plusieurs types d’exceptions
Répertoriez plusieurs types d’exceptions dans un même gestionnaire ou utilisez une classe de base commune. Spring sélectionne le gestionnaire disponible le plus spécifique.
@ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorResponse> handleBadRequest(RuntimeException ex) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}Gérer les erreurs de validation
Interceptez MethodArgumentNotValidException pour extraire les erreurs au niveau des champs des corps de requête validés avec @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));
}Gérer les violations de contraintes
ConstraintViolationException est levée lors de la validation des paramètres de méthode avec @Validated au niveau du service. Gérez-la séparément des erreurs de validation 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);
}Accéder à HttpServletRequest
Ajoutez HttpServletRequest comme paramètre pour obtenir les détails de la requête (URL, méthode, en-têtes) à des fins de journalisation ou pour les inclure dans la réponse d’erreur.
@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 sur les classes d’exception
Annotez les classes d’exception personnalisées avec @ResponseStatus afin de définir automatiquement le statut HTTP sans méthode de gestion, ce qui est plus simple dans les cas courants.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String msg) { super(msg); }
}Restreindre la portée de @ControllerAdvice
Limitez la portée du conseil à des paquets, des annotations ou des classes de base spécifiques à l’aide des attributs de @ControllerAdvice.
@RestControllerAdvice(basePackages = "com.example.api")
public class ApiExceptionHandler { ... }
@RestControllerAdvice(assignableTypes = {UserController.class, OrderController.class})
public class SpecificHandler { ... }Journalisation dans les gestionnaires d’exceptions
Consignez les exceptions au niveau approprié : les erreurs utilisateur (4xx) au niveau WARN, et les erreurs inattendues (5xx) au niveau ERROR avec la trace complète de la pile.
@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é des gestionnaires d'exceptions
Spring sélectionne le gestionnaire le plus spécifique. Si ResourceNotFoundException extends RuntimeException, le gestionnaire pour ResourceNotFoundException est prioritaire sur celui pour RuntimeException.
Vérification rapide
Quelle annotation marque une méthode pour gérer globalement un type d'exception précis ?
Récapitulatif
Utilisez @RestControllerAdvice et @ExceptionHandler pour centraliser la gestion des erreurs. Renvoyez un ResponseEntity avec une structure d'erreur cohérente. Gérez séparément la validation (MethodArgumentNotValidException) et les contraintes (ConstraintViolationException). Consignez les erreurs 4xx comme WARN et les erreurs 5xx comme ERROR.
Questions Fréquemment Posées
La leçon « Gestion globale des exceptions avec @ControllerAdvice » est-elle gratuite ?
Oui — le texte complet de « Gestion globale des exceptions avec @ControllerAdvice » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Gestion globale des exceptions avec @ControllerAdvice » ?
Centralisez la gestion des exceptions dans tous les contrôleurs avec @ExceptionHandler et @ControllerAdvice. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Gestion globale des exceptions avec @ControllerAdvice » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Validation des beans : @NotNull, @Size, @Pattern
- Annotations de contrainte personnalisées
- Gestion globale des exceptions avec @ControllerAdvice
- Détails de problème RFC 7807 et réponses d’erreur cohérentes