web-dev-qa-db-fra.com

[HV000030: Aucun validateur n'a pu être trouvé pour la contrainte «javax.validation.constraints.NotEmpty» de type de validation «Java.lang.String»

Je tiens à souligner que j'ai déjà recherché ce type de problème mais que je n'ai pas trouvé de solution pour mon cas. Dans ma webapp Spring Boot, je reçois toujours cette erreur lors de la validation des beans en utilisant l'annotation @NotEmpty ou @NotBlank du package javax.validation.constraints:

14:04:59,426 ERROR [org.springframework.boot.web.servlet.support.ErrorPageFilter] (default task-33) Forwarding to error page from request [/registrati
on] due to exception [HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'Java.lang.String'.
 Check configuration for 'username']: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation
.constraints.NotEmpty' validating type 'Java.lang.String'. Check configuration for 'username'
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.Java:229)
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.Java:310)
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(Constraint
Tree.Java:244)

Aucune erreur si j'utilise l'annotation @NotNull, mais ce n'est pas le comportement souhaité car il autorise les champs vides. Ce sont mes dépendances pom.xml:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <Java.version>1.8</Java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
          <groupId>nz.net.ultraq.thymeleaf</groupId>
          <artifactId>thymeleaf-layout-dialect</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-Tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-batch</artifactId>
       </dependency>
       <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-Java-client</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/net.sourceforge.nekohtml/nekohtml -->
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.21</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <!-- webjars -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.webjars</groupId>
                    <artifactId>jquery</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.webjars/datatables -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>datatables</artifactId>
            <version>1.10.19</version>
            <exclusions>
                <exclusion>
                    <groupId>org.webjars</groupId>
                    <artifactId>jquery</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <!-- plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin -->
        </plugins>
    </build>


</project>

Je vois que le validateur d'hibernation fonctionne parce que si je n'utilise aucune annotation @NotEmpty ni @NotBlank, d'autres annotations telles que @Size fonctionnent correctement.

Dans mon bean, j'importe javax.validation.constraints. Lors du démarrage de mon JBoss, la ligne suivante concernant le validateur d'hibernation apparaît:

14:04:17,676 INFO  [org.hibernate.validator.internal.util.Version] (background-preinit) HV000001: Hibernate Validator 5.3.5.Final-redhat-2

Ce n'est pas la même version que le pot hibernate-validator 6.0.11 résolu par Maven.

Que ce passe-t-il? Peut-être un conflit de dépendance?

Merci à tous ceux qui ont pu m'aider.

7
Simon

Grâce au commentaire de ChuckL, je viens de découvrir que JBoss 7.1 a son propre hibernate-validator-5.3.5.Final-redhat-2.jar sous:

modules\system\layers\base\org\hibernate\validator\main

C'est pourquoi je voyais la version 5.3.5.Final-redhat-2 dans mes journaux de démarrage et non celle emballée dans mon WAR. Il a également validation-api-1.1.0.Final-redhat-1.jar sous:

modules\system\layers\base\javax\validation\api\main

On pourrait essayer d'exclure ces dépendances en créant un fichier jboss-deployment-structure.xml dans la racine META-INF de la webapp et en essayant d'utiliser celles emballées dans l'application WAR/JAR.

Quoi qu'il en soit, JBoss 7.1 est un conteneur d'implémentation JEE7. Changer les modules de validation du bean fournis avec JBoss pourrait entraîner des conséquences inattendues que je ne veux pas expérimenter :)

La solution propre serait de migrer JBoss vers une version plus récente qui prend en charge JEE8, sinon continuez à utiliser des API obsolètes.

1
Simon

J'ai le même problème; ma spring-boot-starter-web dépendance comprend une dépendance sur org.hibernate: hibernate-validator: 5.3.6.Final mais I. J'ai ajouté cette exclusion à mon POM et tout va bien maintenant:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>
0
Benjamin Mullard