【问题标题】:Error while creating Web service client using Spring and JAX-WS使用 Spring 和 JAX-WS 创建 Web 服务客户端时出错
【发布时间】:2012-06-06 20:10:45
【问题描述】:

在使用 spring 和 JAX-WS 创建 Web 服务客户端时.. 我收到以下错误

我在谷歌上搜索了很多关于它的信息

这是由于旧版本的 JAXB(jaxb-impl:jar:2.1.3:compile) 被 maven 传递获取并因此导致冲突。

尝试使用

修复它
  1. 将 JAXB 2.x 放在 jre/lib/endorsed 文件夹中.. 但没有帮助
  2. 想知道这个问题是否可以通过排除传递依赖获取来解决。
  3. 需要知道如何强制 maven 不获取传递依赖项并强制它使用专门提到的依赖项。

但是我的所有尝试都失败了。有人可以帮我解决这个问题

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
    at $Proxy21.isValidEmail(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:520)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.doInvoke(JaxWsPortClientInterceptor.java:494)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.invoke(JaxWsPortClientInterceptor.java:481)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy22.isValidEmail(Unknown Source)
    at com.rosettastone.succor.webservice.EmailValidateClientImpl.main(EmailValidateClientImpl.java:15)
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
    at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:533)
    ... 15 more

【问题讨论】:

    标签: web-services spring jaxb jax-ws


    【解决方案1】:

    这个异常很可能是由从不同的类加载器加载的 JAX-WS 和 JAXB 引起的。这些库最初是与 JDK 分开开发的,因此必须作为应用程序的一部分进行部署,但现在已成为 JDK 的一部分。如果您继续将它们部署为应用程序的一部分,它们在类路径中可用两次,并且可能会导致诸如 ClassCastException 之类的互操作性问题。

    最简单的解决方案是不再将它们与应用程序一起部署。如果这是一个由 maven 管理的传递依赖,你可以通过排除它来做到这一点。在eclipse中,这是一个简单的:

    • 在 pom 编辑器(这是 pom 文件的默认编辑器)中打开项目的 pom
    • 选择依赖层次标签
    • 右键单击有问题的依赖项
    • 并选择“排除 Maven 工件”

    【讨论】:

      【解决方案2】:

      你可以通过运行 mvn dependency:tree 得到所有的依赖树,然后排除给你带来麻烦的依赖。

      关于 jaxws/jaxb 问题,有很多方法可以指定特定版本,但我们需要知道您的确切意图。 (wsgen、wsimport、运行时出现问题?)

      【讨论】:

      • 我尝试做 wsimport .. 但看起来我面临的问题主要不是由于我使用的 WSDL 文件的差异.. 虽然我遇到了带有规范 2.0 的 WSDL 文件的错误.. . 它与 WSDL 规范 1.1 配合得很好......但我不确定确切的原因.. 因此等待有人在这里澄清
      【解决方案3】:

      我在 jersey-json pom 引入显式版本的 jaxb-impl 时遇到了这个问题。排除该依赖项的 maven 对我有用。

      更多信息在这里:

      http://jersey.java.net/nonav/documentation/latest/chapter_deps.html
      

      (不完全确定为什么它会获得不同版本的 api 和 impl 类,因为 jaxb-impl pom 引入了其首选的 jaxb-api,AFAICT 上没有时髦的类加载,所以无论它是从 JRE 加载还是从明确的 jaxb JAR,它应该有兼容的类......但它没有,并且排除导致它全部工作!)

      【讨论】: