由于Bean Validation API而无法启动Hibernate Validator

我正在尝试在我的项目中使用Hibernate Validator,但它无法正常工作。 在以下行:

SessionFactory sessions = config.buildSessionFactory(builder.build()); 

我得到以下exception:

 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.(SessionFactoryImpl.java:311) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857) at net.myProject.server.util.HibernateUtil.(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.(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) 

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

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

我认为我的问题是一样的。 在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?

编辑:我试图排除javaxvalidationapi:

   org.hibernate hibernate-validator 5.0.3.Final   javax.validation validation-api    

但它似乎没有任何影响。

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

  javax.validation validation-api 1.0.0.GA  

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

对我来说,1.1.0.Final版本javax.validation.validation-api已经有效了。 因为,1.1.0.Final的javax.validation.spi.ConfigurationState接口具有getParameterNameProvider方法,该方法在1.0.0.GA中不存在。

我在pom.xml中添加了以下依赖项

  javax.validation validation-api 1.1.0.Final test  

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

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

Hibernate调用ConfigurationState.getParameterNameProvider :

ValidatorFactoryImpl.java

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

您可以找到getParameterNameProvider的文档:

getParameterNameProvider

ParameterNameProvider getParameterNameProvider()

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

返回:

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

以来:

1.1

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

创建接口时的规则是它们具体设置:您不应该更改接口。 相反,JavaXvalidation器改变了ConfigurationState接口,并且多年来添加了一些新方法。

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

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

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

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