web-dev-qa-db-ja.com

Bean Validation APIが原因でHibernate Validatorを起動できない

プロジェクトで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>

しかし、それは何の効果も持たないようでした。

18
Click Upvote

この依存関係をpom.xmlに追加してみてください

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
</dependency>

Hibernate-validator4.2.0.Finalの使用を検討しない場合は、設定にその1つが含まれていて、正常に機能しています。

17
Koitoer

私にとっては、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>
5
Pijush

私の場合、私はhibernate-validatorを削除しただけで機能しました(検証apiとhibernate-validatorの両方の組み合わせがあり、すべてを試しました)または、Mavenリポジトリに移動し、-> orgからhibernateフォルダーを削除しますプロジェクトを再構築します。

2

私は再び問題を抱えていました。それが私がそれを修正した方法です:

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>
1
Paulo

ここで何が起こっているのかを説明することは有益だと思いました。

Hibernateは ConfigurationState.getParameterNameProvider :を呼び出しています

ValidatorFactoryImpl.Java

_public ValidatorFactoryImpl(ConfigurationState configurationState) {
   ...
   configurationState.getParameterNameProvider()
   ...
}
_

getParameterNameProviderのドキュメントを見つけることができます:

getParameterNameProvider

ParameterNameProvidergetParameterNameProvider()

この構成のパラメーター名プロバイダーを返します。

戻り値:

パラメータ名プロバイダーインスタンス、または定義されていない場合はnull

以来:

1.1

だから問題は何ですか?問題は、メソッドが常に存在するとは限らなかったことです。将来のある時点で追加されました。

そして、インターフェースを作成するときのルールは、それらが具体的に設定されることです:インターフェースを変更してはなりませんever。代わりに、JavaXバリデーターはConfigurationStateインターフェースを変更し、長年にわたっていくつかの新しいメソッドを追加しました。

Java検証コードは、Hiberateに古いConfiguationStateインターフェースを渡しています。必要なインターフェースを実装していません。

Javax.validation.Validation.buildDefaultValidatorFactoryがバージョン1.1をサポートするように更新されていることを確認する必要があります。

1
Ian Boyd

このjarを削除javax.validation:validation-api:1.1.0.Finalは私の問題を解決しました。

検証jarが1つだけであることを確認してください。 2つのjarがある場合、それらは競合してエラーになる可能性があります。

1
Shweta Tiwari

依存関係プロジェクトに移動してhibernate.validatorを削除し、最新バージョンに再インストールします。それは私のために問題を解決しました。

0
Paulo