Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →