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