0

在使用 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
4

3 回答 3

1

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

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

  • 在 pom 编辑器(这是 pom 文件的默认编辑器)中打开项目的 pom
  • 选择依赖层次选项卡
  • 右键单击有问题的依赖项
  • 并选择“排除 Maven 工件”
于 2013-02-01T18:13:02.737 回答
0

您可以通过运行 mvn dependency:tree 来获取所有依赖关系树,然后排除给您带来麻烦的依赖关系。

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

于 2012-06-08T09:06:50.827 回答
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 加载还是从显式 jaxb JAR 加载,它应该有兼容的类......但它没有,并且排除导致它全部工作!)

于 2013-01-07T17:24:37.733 回答