3
votes

Comment utiliser les fonctionnalités de Bean Validation 2.0 (JSR 380) dans Tomcat 8?

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)?


2 commentaires

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.


3 Réponses :


2
votes

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.


1 commentaires

Oui. cela n'a pas aidé. Je vais l'ajouter à la question.



1
votes

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>


1 commentaires

Merci @Matteo Baldi, Java EL manquait en effet.



3
votes

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>


0 commentaires