Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
528 views
in Technique[技术] by (71.8m points)

java - How can I disable javax.validation.api in JBoss 6.4

Similar questions:

How to use bean validation 1.1 in JBoss EAP 6.4.0?

How to change bean-validation version on jboss EAP 6.3?

Can you use bean validation 1.1 (JSR 349) in JBoss EAP 6.4.4?

There seems to be some uncertainty if we can use Bean Validation 1.1 in JBoss 6.x.

My current jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <dependencies>
      <!-- list of modules taken from https://access.redhat.com/articles/1122333 -->
      <module name="javax.activation.api" />
      <module name="javax.annotation.api" />
      <module name="javax.ejb.api" />
      <module name="javax.el.api" />
      <module name="javax.enterprise.api" />
      <module name="javax.enterprise.deploy.api" />
      <module name="javax.faces.api" />
      <module name="javax.inject.api" />
      <module name="javax.interceptor.api" />
      <module name="javax.jms.api" />
      <module name="javax.jws.api" />
      <module name="javax.mail.api" />
      <module name="javax.management.j2ee.api" />
      <module name="javax.persistence.api" />
      <module name="javax.resource.api" />
      <module name="javax.rmi.api" />
      <module name="javax.security.auth.message.api" />
      <module name="javax.security.jacc.api" />
      <module name="javax.servlet.api" />
      <module name="javax.servlet.jsp.api" />
      <module name="javax.servlet.jstl.api" />
      <module name="javax.transaction.api" />
      <!--<module name="javax.validation.api" />-->
      <module name="javax.ws.rs.api" />
      <module name="javax.wsdl4j.api" />
      <module name="javax.xml.bind.api" />
      <module name="javax.xml.jaxp-provider" />
      <module name="javax.xml.registry.api" />
      <module name="javax.xml.rpc.api" />
      <module name="javax.xml.soap.api" />
      <module name="javax.xml.stream.api" />
      <module name="javax.xml.ws.api" />
      <module name="javax.api" />
    </dependencies>
    <exclusions>
      <module name="javaee.api" />
      <module name="org.hibernate.validator" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

I bundle the following dependencies in the .ear:

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.1.0.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.2.Final</version>
</dependency>

But I get the following stacktrace:

14:09:44,085 WARN  [org.jboss.resteasy.plugins.validation.hibernate.AbstractValidatorContextResolver] (AFP-HTTP-96) Unable to load Validation support: javax.validation.ValidationException: Unable to find provider: class org.hibernate.validator.HibernateValidator
at javax.validation.Validation$ProviderSpecificBootstrapImpl.configure(Validation.java:223) [validation-api-1.0.0.GA-redhat-3.jar:1.0.0.GA-redhat-3]
at org.jboss.resteasy.plugins.validation.hibernate.AbstractValidatorContextResolver.getGeneralValidator(AbstractValidatorContextResolver.java:40) [resteasy-hibernatevalidator-provider-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.validation.hibernate.AbstractValidatorContextResolver.getContext(AbstractValidatorContextResolver.java:54) [resteasy-hibernatevalidator-provider-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.validation.hibernate.ValidatorContextResolverCDI.getContext(ValidatorContextResolverCDI.java:16) [resteasy-hibernatevalidator-provider-3.0.9.Final.jar:]
at org.jboss.resteasy.cdi.JaxrsInjectionTarget.validate(JaxrsInjectionTarget.java:113) [resteasy-cdi-3.0.9.Final.jar:]
at org.jboss.resteasy.cdi.JaxrsInjectionTarget.inject(JaxrsInjectionTarget.java:67) [resteasy-cdi-3.0.9.Final.jar:]
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:297) [weld-core-1.1.31.Final-redhat-1.jar:1.1.31.Final-redhat-1]
at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:68) [weld-core-1.1.31.Final-redhat-1.jar:1.1.31.Final-redhat-1]
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:626) [weld-core-1.1.31.Final-redhat-1.jar:1.1.31.Final-redhat-1]
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:653) [weld-core-1.1.31.Final-redhat-1.jar:1.1.31.Final-redhat-1]
at org.jboss.resteasy.cdi.CdiConstructorInjector.construct(CdiConstructorInjector.java:64) [resteasy-cdi-3.0.9.Final.jar:]
at org.jboss.resteasy.cdi.CdiConstructorInjector.construct(CdiConstructorInjector.java:69) [resteasy-cdi-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory.createResource(POJOResourceFactory.java:52) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.9.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.9.Final.jar:]
 ...

As you can see, the validation API is validation-api-1.0.0.GA-redhat-3.jar:1.0.0.GA-redhat-3 which means that the JBoss bundled module is not actually removed from the classpath. Am I doing something wrong or is it a bug which doesn't let me remove javax.validation.api? Do I need to replace more modules with manual dependencies (e.g. resteasy)?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I have verified this answer given by Redhat support -

You can exclude the JBoss provided javax.validation api classes from the JBoss EAP 6 by excluding the jaxrs subsystem.

In addition to excluding validation classes themselves modules that depend on them should be excluded as well. Thus, the exclusion part of jboss-deployment-structure.xml should look like this:

<exclude-subsystems>
  <subsystem name="jaxrs"/>
</exclude-subsystems>
<exclusions>
  <module name="javaee.api"/>
  <module name="javax.validation.api"/>
  <module name="javax.faces.api"/>
  <module name="org.hibernate.validator"/>
</exclusions>

*note - excluding the javaee module limits the available support by RedHat


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...