Adloun

Spring Boot : écrire le serveur (école d'ingénieur) · Chapitre 4 · Application directe du cours

Une contrainte sur deux champs

Validation et gestion des erreurs · niveau 3 (difficile)

Énoncé

Une demande de livraison contient un mode de retrait (boutique ou campus) et un bâtiment. Le bâtiment n'est obligatoire que pour une livraison sur le campus. Exprimer cette règle avec Bean Validation, sans écrire de validateur.

Corrigé

Une méthode booléenne du record, dont le nom commence par is, est vue par Bean Validation comme une propriété ; on l'annote @AssertTrue :


public record LivraisonDemande(
        @NotNull(message = "Le mode de retrait est invalide.")
        @Pattern(regexp = "boutique|campus", message = "Le mode de retrait est invalide.")
        String retrait,

        String batiment) {

    // Une contrainte qui porte sur DEUX champs : une méthode booléenne du record.
    @AssertTrue(message = "Le bâtiment est obligatoire pour une livraison sur le campus.")
    public boolean isBatimentDonneSiCampus() {
        return !"campus".equals(retrait) || (batiment != null && !batiment.isBlank());
    }
}

$ curl -s -X POST localhost:8000/ex8/livraisons \
    -H 'Content-Type: application/json' -d '{"retrait": "campus"}'
{"detail":"La requête contient 1 erreur(s).","instance":"/ex8/livraisons","status":400,"title":"Requête invalide","erreurs":["Le bâtiment est obligatoire pour une livraison sur le campus."]}

La violation porte sur la propriété batimentDonneSiCampus, qui n'est pas un composant du record : le tri par ordre des composants la range en dernier. Pour une règle plus complexe ou réutilisable, on écrirait une contrainte de classe, avec son validateur, comme @Isbn13.

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 →