由于Bean Validation API导致无法启动Hibernate Validator

时间:2014-02-09 06:29:41

标签: java hibernate maven 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)

我发现this question似乎与我的问题非常相似。他将他的解决方案描述为

  

我在类路径中有另一个bean验证器jar。但不是来自   maven,所以我没有意识到。删除它解决了问题。

我认为我的问题是一样的。在http://hibernate.org/validator/documentation/getting-started/,它说:

  

这传递性地将依赖性引入Bean Validation API   (javax.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>

但它似乎没有任何效果。

7 个答案:

答案 0 :(得分:17)

尝试将此依赖项添加到您的pom.xml

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

如果不考虑使用hibernate-validator4.2.0.Final,我的配置中有一个,它工作正常。

答案 1 :(得分:5)

对我来说,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>

答案 2 :(得分:2)

在我的情况下,我刚刚删除了hibernate-validator并且它工作了。(我还有一个验证api和hibernate-validator的组合并尝试了一切)或者你可以去你的maven存储库 - &gt; org然后删除hibernate文件夹并重新生成项目.. 希望它有所帮助..

答案 3 :(得分:1)

我认为解释这里发生的事情会很有用。

Hibernate正在调用ConfigurationState.getParameterNameProvider

<强> ValidatorFactoryImpl.java

public ValidatorFactoryImpl(ConfigurationState configurationState) {
   ...
   configurationState.getParameterNameProvider()
   ...
}

您可以找到getParameterNameProvider的文档:

  

getParameterNameProvider

     

ParameterNameProvider getParameterNameProvider()

     

返回此配置的参数名称提供程序。

     

<强>返回:

     

参数名称提供程序实例,如果未定义则为null

     

<强>时间:

     

1.1

那么问题是什么?问题是该方法并不总是存在。它是在未来的某个时候添加的。

创建界面时的规则是它们具体设置:您不得更改界面 永远 。相反,JavaX验证器改变了 ConfigurationState 接口,并且多年来添加了一些新方法。

java验证代码将Hiberate传递给过时的 ConfiguationState 接口;一个没有实现所需接口的。

您需要确保将javax.validation.Validation.buildDefaultValidatorFactory更新为支持1.1版。

答案 4 :(得分:0)

删除此jar javax.validation:validation-api:1.1.0.Final解决了我的问题。

确保您只有一个验证jar。如果我们有两个罐子,那么它们可能会发生冲突而导致错误。

答案 5 :(得分:0)

转到Dependecies项目并删除hibernate.validator,然后将其重新安装到最新版本。它为我解决了这个问题。

答案 6 :(得分:0)

我又遇到了问题。那就是我解决的方式:

1-将“ spring.validator”从“ 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-在插入依赖项之前的版本之后:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.3.Final</version>
    </dependency>