プロジェクトでHibernate Validatorを使用しようとしていますが、機能していません。次の行:
SessionFactory sessions = config.buildSessionFactory(builder.build());
次の例外が発生します。
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)
この質問 が見つかりました。これは私の問題と非常によく似ています。彼は彼の解決策を
クラスパスにさらに別のBean Validator jarがありました。しかし、Mavenからではないので、私はそれを理解していませんでした。これを削除することで問題は解決しました。
私の問題は同じだと思います。 On http://hibernate.org/validator/documentation/getting-started/ それは言う:
これにより、Bean Validation API(javax.validation:validation-api:1.1.0.Final)への依存関係が一時的に取り込まれます。
古いバージョン(4.3.1.Final)に戻すと問題が修正されるため、それがこの問題の原因であるに違いありません。 HibernateがBean Validation APIをプルしないように強制する方法はありますか?
編集:javax-validation apiを除外しようとしました:
<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>
しかし、それは何の効果も持たないようでした。
この依存関係をpom.xmlに追加してみてください
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
Hibernate-validator4.2.0.Finalの使用を検討しない場合は、設定にその1つが含まれていて、正常に機能しています。
私にとっては、1.1.0.Finalバージョンのjavax.validation.validation-apiが機能していました。なぜなら、1.1.0.Finalのjavax.validation.spi.ConfigurationStateインターフェースにはgetParameterNameProviderメソッドがありますが、これは1.0.0.GAにはありませんでした。
Pom.xmlに以下の依存関係を追加しました
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
<scope>test</scope>
</dependency>
私の場合、私はhibernate-validatorを削除しただけで機能しました(検証apiとhibernate-validatorの両方の組み合わせがあり、すべてを試しました)または、Mavenリポジトリに移動し、-> orgからhibernateフォルダーを削除しますプロジェクトを再構築します。
私は再び問題を抱えていました。それが私がそれを修正した方法です:
1-「web」依存関係からspring.validatorを除外します。
<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-以前のバージョンのディペンデンシーを挿入した後:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
ここで何が起こっているのかを説明することは有益だと思いました。
Hibernateは ConfigurationState.getParameterNameProvider :を呼び出しています
ValidatorFactoryImpl.Java:
_public ValidatorFactoryImpl(ConfigurationState configurationState) {
...
configurationState.getParameterNameProvider()
...
}
_
getParameterNameProvider
のドキュメントを見つけることができます:
getParameterNameProvider
ParameterNameProvider
getParameterNameProvider()
この構成のパラメーター名プロバイダーを返します。
戻り値:
パラメータ名プロバイダーインスタンス、または定義されていない場合はnull
以来:
1.1
だから問題は何ですか?問題は、メソッドが常に存在するとは限らなかったことです。将来のある時点で追加されました。
そして、インターフェースを作成するときのルールは、それらが具体的に設定されることです:インターフェースを変更してはなりませんever。代わりに、JavaXバリデーターはConfigurationStateインターフェースを変更し、長年にわたっていくつかの新しいメソッドを追加しました。
Java検証コードは、Hiberateに古いConfiguationStateインターフェースを渡しています。必要なインターフェースを実装していません。
Javax.validation.Validation.buildDefaultValidatorFactoryがバージョン1.1をサポートするように更新されていることを確認する必要があります。
このjarを削除javax.validation:validation-api:1.1.0.Final
は私の問題を解決しました。
検証jarが1つだけであることを確認してください。 2つのjarがある場合、それらは競合してエラーになる可能性があります。
依存関係プロジェクトに移動してhibernate.validatorを削除し、最新バージョンに再インストールします。それは私のために問題を解決しました。