1
votes

Quelles sont les meilleures pratiques pour gérer ou lever des exceptions dans une application Spring Boot?

J'ai développé une API de repos à l'aide de Spring Boot. Dans l'une de mes méthodes de service, je lance une ServletException , au cas où un utilisateur spécifique ne serait pas trouvé. Je me demande si c'est la meilleure façon de le faire, je veux dire, est-ce la bonne couche pour lever l'exception?


1 commentaires

non, vous devez gérer ce cas et devez renvoyer le code d'erreur 404, ce qui signifie introuvable


4 Réponses :


0
votes

L'un des meilleurs moyens ou ce que je fais est,

  1. Vérifiez les données / paramètres pour des données valides (par exemple, Null vérifie parfois manuellement à l'aide de l'instruction if).
  2. Vérification de la taille des données / paramètres (comme la taille du fichier)
  3. vérification des données ou des paramètres pour une plage valide et un type de données, effectuez un transtypage s'il n'est pas de type valide (comme String, Long, Integer, etc.)
  4. Élevez un message et revenez à cette API, si les données / paramètres ne sont pas valides avant que le système déclenche une exception

0 commentaires

0
votes

Je suppose que vous cherchez à détecter toutes les exceptions survenues dans votre application. Spring-Boot fournit un gestionnaire d'exceptions global pour intercepter toutes les exceptions avec élégance et renvoyer la réponse en fonction de l'exception spécifique. Il vous donne la flexibilité de modifier les codes d'état, les données de réponse et les en-têtes en conséquence. Peu de liens utiles pour implémenter cette fonctionnalité sont -

1.) Dzone < / p>

2.) Tutoriel Spring Boot < / p>


0 commentaires

0
votes

Lancer une exception dans votre @Service est correct. ServletException n'est pas très significatif. Ce que je suggérerais, c'est de créer votre propre classe d'exception étendant RuntimeException et de la lancer.

Vous vous retrouveriez donc avec quelque chose comme ça:

Un contrôleur qui n'appelle qu'une méthode de service (mieux vaut ne pas avoir logique ici)

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

Une classe Service qui appelle la classe DAO (étendant JPARepository )

@Repository
public interface UserDAO extends JpaRepository<User, Long> {
}

DAO:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDAO userDAO;

    @Override
    public User getById(Long id) {
        return userDAO.findById(id).orElseThrow(() -> new UserNotFoundException("No user with id = " + id + " found."));
    }
}

note: il renvoie Optional ce qui est très pratique.

Et enfin votre propre classe Exception .

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        return userService.getById(id);
    }
}

Remarque: @ResponseStatus - il va renvoyer le code d'état HTTP 404 en levant cette exception.

C'est à mon avis, un moyen très propre et efficace de développer votre API de repos.

Jetez également un œil ici: Comment obtenir une erreur spécifique au lieu d'une erreur de service interne . J'ai répondu à une question en fournissant des informations qui pourraient vous être utiles


0 commentaires

4
votes

La création d'un type d'exception personnalisé est une meilleure idée que d'utiliser ServletException . Afin de gérer une exception, vous pouvez utiliser @ControllerAdvice . Créez d'abord le type d'exception personnalisé:

@ControllerAdvice
class CustomExceptionHandler {

  @ExceptionHandler({UserNotFoundException.class})
  public ResponseEntity<Object> handleUserNotFoundException(UserNotFoundException exception) {
    return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
  }
}

En supposant que votre contrôleur et votre service ressemblent plus ou moins à ceci:

@RestController
@RequestMapping("users")
class UserController {

  private final UserService userService;

  UserController(UserService userService) {
    this.userService = userService;
  }

  @GetMapping
  List<String> users() {
    return userService.getUsers();
  }
}

@Service
class UserService {

  List<String> getUsers() {
    // ...
    throw new UserNotFoundException("User not found");
  }
}

Vous pouvez vous gérer UserNotFoundException en utilisant @ControllerAdvice

public class UserNotFoundException extends RuntimeException {

  public UserNotFoundException(String message) {
    super(message);
  }
}


0 commentaires