L’annotation @ExceptionHandler de Spring permet de capturer et gérer des exceptions spécifiques lancées dans les méthodes des contrôleurs. Elle est souvent utilisée avec @ControllerAdvice pour centraliser la gestion des erreurs, mais peut aussi être utilisée directement dans un contrôleur.
· @ExceptionHandler (Exception.class) permet d’intercepter une exception spécifique.
· Retourne une réponse HTTP personnalisée (ex. message d’erreur, statut).
@RestController
@RequestMapping("/api")
public class ExempleController {
@GetMapping("/test")
public String testErreur() {
throw new IllegalArgumentException("Paramètre invalide !");
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgument(IllegalArgumentException ex) {
return ResponseEntity.badRequest().body("Erreur : " + ex.getMessage());
}
}
Lorsqu’un IllegalArgumentException est lancé dans ce contrôleur, handleIllegalArgument() est exécuté.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("Non trouvé : " + ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneric(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Erreur interne : " + ex.getMessage());
}
}
Ici, toutes les exceptions de type ResourceNotFoundException et Exception seront interceptées globalement.
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationErrors(MethodArgumentNotValidException ex) {
Map<String, String> erreurs = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
erreurs.put(error.getField(), error.getDefaultMessage())
);
return ResponseEntity.badRequest().body(erreurs);
}
Cela intercepte les erreurs de validation dans les @RequestBody annotés avec @Valid.