Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 4 · Exercice de TD
Un livre épuisé
Validation et gestion des erreurs · niveau 2
Énoncé
Écrire POST /api/livres/{isbn}/reservation, qui réserve un exemplaire. Si le stock est nul, le service lève une LivreEpuiseException, que l'API traduit par un 409. Placer le gestionnaire dans une nouvelle classe @RestControllerAdvice : que se passe-t-il si l'on ne précise pas son ordre ?
Corrigé
@PostMapping("/api/livres/{isbn}/reservation")
public Map<String, String> reserver(@PathVariable String isbn) {
Livre livre = livres.trouver(isbn);
if (livre.stock() == 0) {
throw new LivreEpuiseException(livre.titre());
}
return Map.of("message", "Un exemplaire de « " + livre.titre() + " » vous attend.");
}
// Prioritaire : sinon le gestionnaire générique (Exception) d’ErreursApi répondrait 500.
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ErreursReservation {
// Exercice 4.10 : l’adresse qui identifie ce type de problème.
private static final URI LIVRE_EPUISE =
URI.create("https://librairie-du-campus.fr/problemes/livre-epuise");
@ExceptionHandler(LivreEpuiseException.class)
public ProblemDetail epuise(LivreEpuiseException ex) {
ProblemDetail probleme = ProblemDetail.forStatusAndDetail(HttpStatus.CONFLICT, ex.getMessage());
probleme.setType(LIVRE_EPUISE);
probleme.setTitle("Livre épuisé");
probleme.setProperty("erreur", ex.getMessage());
return probleme;
}
}
$ curl -i -X POST localhost:8000/api/livres/9782956300045/reservation
HTTP/1.1 409
Content-Type: application/problem+json
Transfer-Encoding: chunked
Date: Fri, 02 Oct 2026 21:56:38 GMT
{"detail":"Livre épuisé : « Physique générale ».","instance":"/api/livres/9782956300045/reservation","status":409,"title":"Livre épuisé","type":"https://librairie-du-campus.fr/problemes/livre-epuise","erreur":"Livre épuisé : « Physique générale »."}
Sans @Order, les deux classes @RestControllerAdvice ont le même rang, et Spring peut consulter ErreursApi d'abord. Or celle-ci sait traiter toute Exception, grâce à inattendue : le livre épuisé deviendrait une erreur 500. Avec @Order(Ordered.HIGHEST_PRECEDENCE), la classe la plus spécialisée est consultée en premier. Une alternative plus simple est de placer le gestionnaire dans ErreursApi, avec les autres.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.