J'essaie d'utiliser Hibernate Validator dans mon projet, mais cela ne fonctionne pas. Sur la ligne suivante:
SessionFactory sessions = config.buildSessionFactory(builder.build());
Je reçois l'exception suivante:
org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.Java:154)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.Java:311)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1857)
at net.myProject.server.util.HibernateUtil.<clinit>(HibernateUtil.Java:32)
... 36 more
Caused by: Java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.Java:119)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.Java:45)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.Java:217)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.Java:111)
J'ai trouvé cette question qui semble assez semblable à mon problème. Il décrit sa solution comme
J'ai eu encore un autre bocal validateur de haricots dans le chemin de classe. Mais pas de Maven, donc je ne m'en suis pas rendu compte. Enlever cela a résolu le problème.
Je pense que mon problème est le même. Sur http://hibernate.org/validator/documentation/getting-started/ il dit:
Cela tire transitoirement dans la dépendance à l'API de validation de bean (javax.validation: validation-api: 1.1.0.Final)
Cela doit être à l'origine de ce problème, car le retour à une version plus ancienne (4.3.1.Final) corrige le problème. Existe-t-il un moyen de forcer Hibernate à ne pas intégrer l'API de validation de bean?
Edit: j'ai essayé d'exclure l'api de validation javax:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.3.Final</version>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Mais cela ne semble pas avoir d'effet.
Essayez d'ajouter cette dépendance à votre pom.xml.
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
Sinon, envisagez d'utiliser hibernate-validator4.2.0.Final, mais celui-ci est dans ma configuration et tout fonctionne correctement.
Pour moi, la version 1.1.0.Final javax.validation.validation-api avait fonctionné. En effet, l'interface javax.validation.spi.ConfigurationState de 1.1.0.Final a la méthode getParameterNameProvider, absente de la version 1.0.0.GA.
J'ai ajouté la dépendance ci-dessous dans pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
<scope>test</scope>
</dependency>
dans mon cas, je viens de supprimer le validateur d'hibernation et tout a fonctionné (j'avais également un combo de validation api et d'hibernate-validateur et j'ai tout essayé) ou vous pouvez accéder à votre référentiel maven -> org, puis supprimer le dossier hibernate et reconstruisez à nouveau votre projet ... espérons que cela vous aidera ...
J'ai pensé qu'il serait utile d'expliquer ce qui se passe ici.
Hibernate appelle ConfigurationState.getParameterNameProvider :
ValidatorFactoryImpl.Java:
public ValidatorFactoryImpl(ConfigurationState configurationState) {
...
configurationState.getParameterNameProvider()
...
}
Vous pouvez trouver la documentation de getParameterNameProvider
:
getParameterNameProvider
ParameterNameProvider
getParameterNameProvider()
Retourne le fournisseur de nom de paramètre pour cette configuration.
Résultats:
nom de paramètre instance de fournisseur ou null si non défini
Puisque:
1.1
Donc quel est le problème? Le problème est que la méthode n'a pas toujours existé. Il a été ajouté à un moment donné dans le futur.
Et la règle lors de la création d'interfaces est qu'elles sont définies de manière concrète: vous ne devez pas changer d'interface jamais. Au lieu de cela, le validateur JavaX a modifié l'interface ConfigurationState et ajouté quelques nouvelles méthodes au fil des ans.
Le code de validation Java transmet à Hiberate une interface obsolète ConfiguationState; un qui n'implémente pas les interfaces requises.
Vous devez vous assurer que javax.validation.Validation.buildDefaultValidatorFactory est mis à jour pour prendre en charge la version 1.1.
J'ai eu le problème encore. C'est comme ça que j'ai résolu ça:
1-Exclure spring.validator de la dépendance 'web':
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
2-Après avoir inséré la dépendance avec une version précédente:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
Accédez au projet de dépendances et supprimez-le, hibernate.validator, puis réinstallez-le dans la version la plus récente. Cela a résolu le problème pour moi.
Supprimer ce bocal javax.validation:validation-api:1.1.0.Final
a résolu mon problème.
Assurez-vous de n'avoir qu'un seul bocal de validation. Si nous avons deux bocaux, ils peuvent entrer en conflit et générer une erreur.