Contenu du cours
Backend Spring Boot
Backend Spring Boot
Gestion des Exceptions
La gestion des exceptions dans une API REST utilisant Spring Boot est un aspect crucial du développement qui permet une gestion efficace des erreurs et informe les clients des problèmes qui se sont produits sur le serveur. Examinons ce processus plus en détail.
Comment cela aide-t-il à notifier le client des erreurs ?
La gestion des erreurs dans une API REST aide à standardiser le format des réponses d'erreur, ce qui facilite le travail des clients avec les réponses. Cela, à son tour, les informe des raisons des erreurs, permettant aux clients de comprendre ce qui s'est mal passé et comment corriger le problème.
De plus, une telle gestion permet de différencier les types d'erreurs, comme les erreurs de validation ou les problèmes d'accès, rendant les messages d'erreur plus précis et utiles.
Mise en œuvre de la gestion des exceptions à l'aide d'annotations
Spring Boot fournit plusieurs outils pour la gestion des exceptions. Les principaux sont les annotations @ControllerAdvice
et @ExceptionHandler
.
L'annotation @ControllerAdvice
vous permet de définir des gestionnaires d'exceptions globales pour tous les contrôleurs de l'application, ce qui aide à centraliser la gestion des erreurs et à éviter la duplication de code.
Dans une classe annotée avec @ControllerAdvice
, les méthodes annotées avec @ExceptionHandler
spécifient quels types d'exceptions une méthode particulière doit gérer. Cela simplifie la gestion des erreurs et rend le code plus propre et mieux organisé.
GlobalExceptionHandler
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
Dans cette classe, la méthode handleException()
sera invoquée lorsqu'une exception de type ApiException
se produit dans l'application. L'annotation @ExceptionHandler(ApiException.class)
indique que cette méthode gère les exceptions de ce type spécifique.
Création d'une Exception Personnalisée
Mais qu'est-ce que l'ApiException
exactement ? C'est une exception personnalisée créée spécifiquement pour notre API, et nous pouvons créer nos propres exceptions et les utiliser dans notre API REST.
Vous pouvez apprendre à créer vos propres exceptions personnalisées ici.
ApiException
public class ApiException extends RuntimeException { // HTTP status code associated with this exception private final HttpStatus httpStatus; // Constructor to initialize the exception with a message and an HTTP status public ApiException(String message, HttpStatus httpStatus) { super(message); this.httpStatus = httpStatus; } // Getter method to retrieve the HTTP status public HttpStatus getHttpStatus() { return httpStatus; } }
Ce code définit la classe ApiException
, qui étend RuntimeException
et inclut un champ supplémentaire httpStatus
pour stocker le statut HTTP. Le constructeur de la classe prend un message et un statut HTTP, qui sont ensuite passés au constructeur de base et stockés dans le champ httpStatus
.
Après cela, nous pouvons lancer une exception depuis notre application :
Main
public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestToModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); // If the book was not found in the repository, throw an ApiException with a NOT_FOUND status if (repositoryBook == null) { throw new ApiException("Not found book by id: " + id, HttpStatus.NOT_FOUND); } return MapperBook.modelToResponseDto(repositoryBook); }
Ce type d'exception sera capturé par une méthode handleException(ApiException ex)
conçue pour la gérer, et au sein de cette méthode, nous pouvons définir la logique pour gérer l'exception.
La logique que nous voulons implémenter est de capturer les exceptions liées à l'API et de retourner une réponse structurée contenant des informations sur l'erreur ainsi que le statut HTTP approprié.
Main
@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Ce code gère l'ApiException
en créant un ResponseEntity
avec des informations d'erreur. La méthode handleException()
construit un objet ErrorResponse
avec le message de l'exception et définit le statut HTTP à partir du champ httpStatus
de l'exception, le renvoyant au client.
Nous avons initialisé le champ httpStatus
lorsque nous lançons l'exception dans notre application.
ErrorResponse
est une classe utilisée pour fournir des informations sur l'erreur. Elle contient un champ error
qui affiche la description de l'erreur et est créée à l'aide des annotations @Data
et @Builder
.
ErrorResponse
@Data @Builder public class ErrorResponse { private String error; }
L'annotation @Builder
de Lombok
simplifie la création d'objets en implémentant le modèle Builder. Elle permet une manière plus lisible et maintenable de construire des objets, en particulier ceux avec de nombreux paramètres. Par exemple, vous pouvez créer une instance ErrorResponse
comme ceci :
La méthode builder()
initialise un nouveau builder pour la classe ErrorResponse
. La méthode error("ERROR")
définit le champ error
à "ERROR", et la méthode build()
construit l'objet ErrorResponse
final avec la valeur spécifiée.
Gestion des erreurs dans notre application
Résumé
La gestion des exceptions dans une API REST centralise la gestion des erreurs en fournissant un format de réponse cohérent pour le client. Cela simplifie la compréhension et la gestion des erreurs, car les clients reçoivent des messages clairs et structurés.
L'utilisation des annotations @ControllerAdvice
et @ExceptionHandler
permet la personnalisation de la manière dont différentes exceptions sont gérées, tandis que les exceptions personnalisées peuvent inclure des informations supplémentaires, telles que le statut HTTP.
Merci pour vos commentaires !