由于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子,那么它们可能会发生冲突而导致错误。
- 使用struts 2和hibernate在jsp页面中显示Blob(图像)
- java.net.SocketException:管道损坏
- com.thoughtworks.xstream.converters.ConversionException
- 我可以使用带有beanvalidation的hibernate实体注释吗?
- 用Hibernate Criteria查询ManyToMany关系
- 许多对许多表内多对多
- 筛选由jpa / hibernate查询返回的实体中包含的列表
- Hibernate OneToMany java.lang.StackOverflowError
- 为什么我得到org.hibernate.HibernateException:没有配置CurrentSessionContext