Java 如何在JBoss EAP 6.4.0中使用bean验证1.1?

Java 如何在JBoss EAP 6.4.0中使用bean验证1.1?,java,jakarta-ee,jboss,bean-validation,Java,Jakarta Ee,Jboss,Bean Validation,我有一个简单的restful web服务,它使用Bean Validation 1.1(Hibernate Validator 5.1.3作为实现),我正在JBoss EAP 6.4.0上部署它。由于JBoss 6.4与Bean Validation 1.0及其实现库(Hibernate Validator 4.3.2)捆绑在一起,因此存在冲突,所有服务调用都不起作用。下面是我得到的错误: java.lang.NoSuchMethodError: javax.validation.Validat

我有一个简单的restful web服务,它使用Bean Validation 1.1(Hibernate Validator 5.1.3作为实现),我正在JBoss EAP 6.4.0上部署它。由于JBoss 6.4与Bean Validation 1.0及其实现库(Hibernate Validator 4.3.2)捆绑在一起,因此存在冲突,所有服务调用都不起作用。下面是我得到的错误:

java.lang.NoSuchMethodError: javax.validation.Validator.forExecutables()Ljavax/validation/executable/ExecutableValidator;
    org.apache.cxf.validation.BeanValidationProvider.getExecutableValidator(BeanValidationProvider.java:153)
    org.apache.cxf.validation.BeanValidationProvider.validateReturnValue(BeanValidationProvider.java:124)
    org.apache.cxf.validation.BeanValidationOutInterceptor.handleValidation(BeanValidationOutInterceptor.java:45)
    org.apache.cxf.validation.AbstractValidationInterceptor.handleMessage(AbstractVa
上述异常中引用的类/方法仅在验证api 1.1中可用。因此,我想排除JBoss提供的模块“javax.validation.api”和“org.hibernate.validator”,这样就可以使用war文件中捆绑的JAR。为此,我创建了一个包含以下内容的jboss deployment structure.xml文件,并将其放在应用程序的WEB-INF文件夹中:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="javax.validation.api" />
            <module name="org.hibernate.validator" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

现在,我得到了这个错误:

java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
    org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:135)
    org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:45)
    org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:236)
    javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
java.lang.NoSuchMethodError:javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
org.hibernate.validator.internal.engine.validatoryImpl.(validatoryImpl.java:135)
org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:45)
org.hibernate.validator.internal.engine.configurationmpl.buildValidatorFactory(configurationmpl.java:236)
validation.validation.buildDefaultValidatorFactory(validation.java:111)

我做错了什么?如何让bean validation 1.1在JBoss 6.4.0中工作

JBoss EAP中的警告所有jee api都由一个模块提供:javaee.api 因此,如果您只想升级一个,您需要排除javaee.api,并重新包括所有其他。 因此,请使用以下jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
        <exclusions>
            <module name="javaee.api" />
        </exclusions>
        <dependencies>
            <module name="javax.activation.api" export="true" />
            <module name="javax.annotation.api" export="true" />
            <module name="javax.ejb.api" export="true" />
            <module name="javax.el.api" export="true" />
            <module name="javax.enterprise.api" export="true" />
            <module name="javax.enterprise.deploy.api" export="true" />
            <module name="javax.inject.api" export="true" />
            <module name="javax.interceptor.api" export="true" />
            <module name="javax.jms.api" export="true" />
            <module name="javax.jws.api" export="true" />
            <module name="javax.mail.api" export="true" />
            <module name="javax.management.j2ee.api" export="true" />
            <module name="javax.persistence.api" export="true" />
            <module name="javax.resource.api" export="true" />
            <module name="javax.rmi.api" export="true" />
            <module name="javax.security.auth.message.api" export="true" />
            <module name="javax.security.jacc.api" export="true" />
            <module name="javax.servlet.api" export="true" />
            <module name="javax.servlet.jsp.api" export="true" />
            <module name="javax.transaction.api" export="true" />
            <!-- remove the validation 1.0 <module name="javax.validation.api" export="true" /> -->
            <module name="javax.ws.rs.api" export="false" services="export" />
            <module name="javax.xml.bind.api" export="true" />
            <module name="javax.xml.registry.api" export="true" />
            <module name="javax.xml.soap.api" export="true" />
            <module name="javax.xml.ws.api" export="true" />
            <!-- This one always goes last. -->
            <module name="javax.api" export="true" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>


看起来新的Hibernate Validator版本已经启动,但新的Bean验证API没有启动。也许您可以在日志中验证哪个版本的验证器被引导。如何使用Bean验证?你有自己的验证器吗?@Hardy,我的应用程序是基于CXF的restfulweb服务。因此,我只定义了一个for
org.apache.cxf.validation.BeanValidationFeature
,并将其添加为所述的特性。CXF 3.1.0依赖于bean validation 1.1。您可以使用1.1查看我的答案-我刚刚尝试了您的建议,但不幸的是,它没有产生任何影响。。。同样的错误!