Bean Validation 2.0 (JSR 380) devrait pouvoir effectuer la validation suivante:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.15.Final</version> </dependency>
Mais il semble ignorer simplement l'annotation @NotNull. De plus, les annotations @NotBlank
et @NotEmpty
sont ignorées.
J'ai l'API Bean Validation 2.0 et l'implémentation de référence dans mon chemin de classe via Maven:
@Valid public class MyBean{ private List<@NotNull String> members; }
J'utilise Java 8 et Tomcat 8 avec Jersey.
Dois-je configurer Tomcat
d'une manière ou d'une autre pour utiliser l'implémentation 2.0 et non celui par défaut qui est fourni dans JDK 8 (comme l'activation du support Optional
dans Jackson
)?
3 Réponses :
Avez-vous essayé d'ajouter l'annotation @Valid à votre classe / champ où la validation devrait être effectuée?
D'après mon expérience, pour une raison quelconque, cette annotation doit être présente pour que la validation soit exécutée.
Oui. cela n'a pas aidé. Je vais l'ajouter à la question.
Il semble qu'il vous manque l'implémentation EL
, essayez d'ajouter cette dépendance:
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b09</version> </dependency>
Merci @Matteo Baldi, Java EL manquait en effet.
La cause du problème était que l'extension Bean Validation pour Jersey apporte implicitement une ancienne version du validateur Hibernate, alors que le validateur Hibernate que j'ai explicitement demandé dans le pom.xml n'est pas utilisé.
Pour le résoudre, j'ai exclu le validateur d'hibernation que Jersey tire implicitement:
<dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b09</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> <scope>test</scope> </dependency>
ajoute ma version de Bean Validation
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.15.Final</version> </dependency>
et ajoute Java EL:
<dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-bean-validation</artifactId> <version>2.27</version> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </exclusion> </exclusions> </dependency>
Veuillez également ajouter le code à l'endroit où vous prévoyez que la validation aura lieu. Bien que Tomcat soit un conteneur de servlets uniquement, je considère que l'API de validation devrait généralement être utilisée intégrée à la technologie Java EE: jetez un œil à chapitre intégration de la documentation du validateur
Merci @Selaron, votre suggestion m'a emmené à jersey.github.io/documentation/latest /bean-validation.html , qui est le composant responsable de la validation de Bean à Jersey. Cela m'a conduit à une solution que je détaillerai ci-dessous.