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?
4 Réponses :
L'un des meilleurs moyens ou ce que je fais est,
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>
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 classeDAO
(étendantJPARepository
)
@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
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); } }
non, vous devez gérer ce cas et devez renvoyer le code d'erreur 404, ce qui signifie introuvable