使用Spring和JAX-WS创建Web服务客户端时出错

时间:2012-06-06 20:10:45

标签: web-services spring jaxb jax-ws

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

在谷歌上搜索了很多关于它的事情,我注意到了

由于旧版本的JAXB(jaxb-impl:jar:2.1.3:compile)而发生这种情况,该版本由maven传递,因此导致冲突。

尝试使用

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

    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
    

3 个答案:

答案 0 :(得分:1)

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

最简单的解决方案是不再使用应用程序部署它们。如果这是由maven管理的传递依赖,您可以通过排除它来实现。在eclipse中,这很简单:

  • 在pom编辑器中打开项目的pom(这是pom文件的默认编辑器)
  • 选择依赖关系层次结构选项卡
  • 右键单击违规依赖项
  • 并选择“排除Maven神器”

答案 1 :(得分:0)

您可以通过运行mvn dependency:tree来获取所有依赖项树,然后排除导致您出现问题的依赖项。

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

答案 2 :(得分:0)

我点击了这里,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还是从JRE加载显式的jaxb JAR,它应该有兼容的类......但它没有,并且排除导致它全部工作!)