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
Servicequi 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