Détail...

Gestion des exceptions : @ExceptionHandler

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.

Principe

·      @ExceptionHandler (Exception.class) permet d’intercepter une exception spécifique.

·      Retourne une réponse HTTP personnalisée (ex. message d’erreur, statut).

Utilisation dans un contrôleur

@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é.

Utilisation avec @ControllerAdvice (gestion centralisée)

@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.

Pour les erreurs de validation (@Valid)

@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.