关于 web 服务:java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl 不能转换为 com.sun.xml.bind.api.JAXBRIContext

java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.bind.api.JAXBRIContext

我创建了一个 jaxws 网络服务。我完全按照 url

服务完美无误。但是服务器在请求命中时出错。

1
2
3
4
5
6
7
SEVERE: caught throwable
java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.bind.api.JAXBRIContext
    at com.sun.xml.ws.db.glassfish.JAXBRIContextFactory.newContext(JAXBRIContextFactory.java:74)
    at com.sun.xml.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:149)
    at com.sun.xml.ws.message.jaxb.JAXBMessage.create(JAXBMessage.java:160)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createSOAP11Fault(SOAPFaultBuilder.java:433)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:210)

我检查了 stackoverflow 和许多其他网站都说 jar 文件冲突。
我使用 java-6-openjdk。
以下是我在码头服务器中的 jar 文件列表。

gmbal-api-only.jar ha-api.jar jaxb-core.jar
jaxb-impl.jar jaxws-rt.jar management-api.jar
policy-2.3.1.jar stax-ex.jar streambuffer-1.5.1.jar

由于上面的罐子不工作,我试过了
到这里
下载 JAX-WS RI 发行版。

但是那些罐子给出了同样的错误。


我也遇到了同样的异常,用谷歌搜索确认这是因为类路径/jar 问题。

我使用 Java 6.0 作为构建和运行时环境,我的项目设置有 jaxb-api.jar 和 jaxb-impl.jar。我只是从类路径中删除了这两个 jar,它就可以工作了。

就像我们拥有 Java 6.0 一样,我们不需要显式地使用 JAX 绑定 jar。 Java 6.0 默认自带。


我的 Java 7 项目也发生了同样的错误。移除
com/sun/xml/bind/jaxb-impl-2.2.6.jar
com/sun/xml/bind/jaxb-xjc-2.2.6.jar

依赖解决了这个问题。

替代解决方案:

clientPort 是一个带有@WebService 注解的接口。

1
2
3
4
    BindingProvider prov = (BindingProvider) clientPort;        
    prov.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl);
    prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, serviceUsername);
    prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, servicePassword);


检查此线程:Web 服务的 Web 客户端。我认为的主要问题是您有几个版本不同的 jaxb jar。例如,我认为 jaxb 已经是 jaxws-rt.jar 的一部分,这意味着您不需要 jaxb-core.jar 和 jaxb-impl.jar。