"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Gestion des exceptions dans Spring Boot

Gestion des exceptions dans Spring Boot

Publié le 2024-08-25
Parcourir:855

Exception Handling in Spring Boot

La gestion des exceptions est un élément essentiel de la création d'applications robustes et conviviales. Dans Spring Boot, nous pouvons gérer les exceptions de différentes manières pour garantir que notre application reste stable et fournit des commentaires significatifs aux utilisateurs. Ce guide couvrira différentes stratégies de gestion des exceptions, notamment les exceptions personnalisées, la gestion globale des exceptions, les erreurs de validation et les meilleures pratiques de production.

1. Bases de la gestion des exceptions

Les

Exceptions sont des événements qui perturbent le déroulement normal d'un programme. Ils peuvent être divisés en :

  • Exceptions vérifiées : Exceptions vérifiées au moment de la compilation.
  • Exceptions non vérifiées (exceptions d'exécution) : Exceptions qui se produisent pendant l'exécution.
  • Erreurs : Problèmes graves que les applications ne devraient pas gérer, comme OutOfMemoryError.

2. Classes d'exceptions personnalisées

La création de classes d'exception personnalisées aide à gérer les conditions d'erreur spécifiques dans votre application.

package com.example.SpringBootRefresher.exception;

public class DepartmentNotFoundException extends RuntimeException {
    public DepartmentNotFoundException(String message) {
        super(message);
    }
}

3. Gestion des exceptions dans les contrôleurs

@ExceptionHandlerAnnotation :
Vous pouvez définir des méthodes pour gérer les exceptions dans vos classes de contrôleur.

package com.example.SpringBootRefresher.controller;

import com.example.SpringBootRefresher.exception.DepartmentNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DepartmentController {

    @GetMapping("/department")
    public String getDepartment() {
        // Simulate an exception
        throw new DepartmentNotFoundException("Department not found!");
    }

    @ExceptionHandler(DepartmentNotFoundException.class)
    public ResponseEntity handleDepartmentNotFoundException(DepartmentNotFoundException ex) {
        return new ResponseEntity(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

4. Gestion globale des exceptions avec @ControllerAdvice

Pour gérer les exceptions à l'échelle mondiale, vous pouvez utiliser @ControllerAdvice et un gestionnaire d'exceptions centralisé.

package com.example.SpringBootRefresher.error;

import com.example.SpringBootRefresher.entity.ErrorMessage;
import com.example.SpringBootRefresher.exception.DepartmentNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
@ResponseStatus
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(DepartmentNotFoundException.class)
    public ResponseEntity handleDepartmentNotFoundException(DepartmentNotFoundException exception, WebRequest request) {
        ErrorMessage message = new ErrorMessage(
                HttpStatus.NOT_FOUND.value(),
                exception.getMessage(),
                request.getDescription(false)
        );

        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .body(message);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleGlobalException(Exception exception, WebRequest request) {
        ErrorMessage message = new ErrorMessage(
                HttpStatus.INTERNAL_SERVER_ERROR.value(),
                exception.getMessage(),
                request.getDescription(false)
        );

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(message);
    }
}

5. Création d'une réponse d'erreur standard

Définissez une classe de réponse d'erreur standard pour structurer vos messages d'erreur.

package com.example.SpringBootRefresher.entity;

public class ErrorMessage {
    private int statusCode;
    private String message;
    private String description;

    public ErrorMessage(int statusCode, String message, String description) {
        this.statusCode = statusCode;
        this.message = message;
        this.description = description;
    }

    // Getters and setters

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

6. Gestion des erreurs de validation

Spring Boot s'intègre bien à Bean Validation (JSR-380). Pour gérer les erreurs de validation globalement, utilisez @ControllerAdvice.

package com.example.SpringBootRefresher.error;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
@ResponseStatus
public class ValidationExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map errors = new HashMap();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return new ResponseEntity(errors, HttpStatus.BAD_REQUEST);
    }
}

7. Utilisation de @ResponseStatus pour les exceptions simples

Pour les cas simples, vous pouvez annoter une classe d'exception avec @ResponseStatus pour spécifier le code d'état HTTP.

package com.example.SpringBootRefresher.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class DepartmentNotFoundException extends RuntimeException {
    public DepartmentNotFoundException(String message) {
        super(message);
    }
}

8. Meilleures pratiques de production

  1. Réponses d'erreur cohérentes : Assurez-vous que votre application renvoie des réponses d'erreur cohérentes et structurées. Utilisez une classe de réponse d'erreur standard.
  2. Journalisation : Journaliser les exceptions à des fins de débogage et de surveillance. Assurez-vous que les informations sensibles ne sont pas exposées dans les journaux.
  3. Messages conviviaux : Fournissez des messages d'erreur conviviaux. Évitez d'exposer les détails internes ou les traces de pile aux utilisateurs.
  4. Sécurité : Soyez prudent concernant les informations incluses dans les réponses aux erreurs afin d'éviter d'exposer des données sensibles.
  5. Documentation : Documentez votre stratégie de gestion des exceptions pour votre équipe et les futurs responsables.

Résumé

La gestion des exceptions dans Spring Boot implique l'utilisation d'annotations telles que @ExceptionHandler, @ControllerAdvice et @ResponseStatus pour gérer efficacement les erreurs. En créant des exceptions personnalisées, en gérant les erreurs de validation et en suivant les meilleures pratiques, vous pouvez créer des applications robustes qui gèrent les erreurs avec élégance et fournissent des commentaires significatifs aux utilisateurs. L'utilisation des fonctionnalités de Java 17 garantit que votre application tire parti des dernières améliorations de l'écosystème Java.

Déclaration de sortie Cet article est reproduit à: https://dev.to/isaactony/exception-handling-in-spring-boot-2lgd?1 S'il y a une contrefaçon, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3