Hibernate在Tomee7中作为JPA提供者和Bean验证器

Hibernate在Tomee7中作为JPA提供者和Bean验证器,jpa,bean-validation,hibernate-validator,apache-tomee,tomee-7,Jpa,Bean Validation,Hibernate Validator,Apache Tomee,Tomee 7,JPA 在ApacheTomcat(TOME)/8.5.11(7.0.3)中从()配置Hibernate 5.2作为JPA实现者 Bean验证 要将Hibernate验证器实现为Bean验证器,将Hibernate-Validator-5.4.0.Final.jar,Hibernate-Validator-annotation-processor-5.4.0.Final.jar,Hibernate-Validator-cdi-5.4.0.Final.jar放在/lib文件夹中,并删除bval-c

JPA

在ApacheTomcat(TOME)/8.5.11(7.0.3)中从()配置Hibernate 5.2作为JPA实现者

Bean验证

要将Hibernate验证器实现为Bean验证器,将
Hibernate-Validator-5.4.0.Final.jar
Hibernate-Validator-annotation-processor-5.4.0.Final.jar
Hibernate-Validator-cdi-5.4.0.Final.jar
放在/lib文件夹中,并删除
bval-core-1.1.2.jar

但部署webapp时会出现以下错误:

DEBUG: No META-INF/validation.xml found. Using annotation based configuration only.
19-May-2017 09:16:14.276 SEVERE [localhost-startStop-1] org.apache.openejb.cdi.OpenEJBLifecycle.startApplication CDI Beans module deployment failed
org.apache.webbeans.exception.WebBeansDeploymentException: javax.enterprise.inject.AmbiguousResolutionException: There is more than one Bean with type javax.validation.ValidatorQualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  validator, Bean Owner : [ValidationInterceptor, WebBeansType:INTERCEPTOR, Name:null, API Types:[java.io.Serializable,java.lang.Object,org.hibernate.validator.internal.cdi.interceptor.ValidationInterceptor], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]]
found beans: 
Validator, WebBeansType:VALIDATION, Name:null, API Types:[java.lang.Object,javax.validation.Validator], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any] from jar:file:/webserver/tomee/lib/javaee-api-7.0-1.jar!/javax/validation/Validator.class
ValidatorImpl, WebBeansType:THIRDPARTY, Name:null, API Types:[org.hibernate.validator.internal.engine.ValidatorImpl,javax.validation.executable.ExecutableValidator,java.lang.Object,javax.validation.Validator], Qualifiers:[javax.enterprise.inject.Default,org.hibernate.validator.cdi.HibernateValidator,javax.enterprise.inject.Any] from jar:file:/webserver/tomee/lib/hibernate-validator-5.4.0.Final.jar!/org/hibernate/validator/internal/engine/ValidatorImpl.class
at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:331)
at org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:196)
at org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:189)
at org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:41)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:914)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:718)
at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1298)
at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1124)
at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:133)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:596)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1805)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.enterprise.inject.AmbiguousResolutionException: There is more than one Bean with type javax.validation.ValidatorQualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :  validator, Bean Owner : [ValidationInterceptor, WebBeansType:INTERCEPTOR, Name:null, API Types:[java.io.Serializable,java.lang.Object,org.hibernate.validator.internal.cdi.interceptor.ValidationInterceptor], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]]

如何解决此问题???

如果您包括hibernate validator,您可以在application.properties(WEB-INF)或conf/system.properties(global)中解决此问题:


如Hibernate Validator documentation()中所述,如果应用程序在不提供现成CDI集成的环境中运行,您可以通过添加
Hibernate Validator CDI

ApacheTomcat(TOME)/8.5.11(7.0.3)通过开箱即用的方式实现CDI


/lib
文件夹中删除
hibernate-validator-cdi-5.4.0.Final.jar
后,问题已解决。

使用自定义cdi扩展,您可以记录所有验证程序bean,从而知道哪些扩展/类冲突。可能只需要一些扫描调整。通过删除hibernate验证程序cdi jar解决了这个问题
org.apache.bval.cdi.BValExtension.active=false