我正在尝试在我的项目中使用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>
但它似乎没有任何效果。
答案 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>