JAX-WS Provider (JAXB) 的加载顺序

问题

项目中使用JAX-WS 2.1.4,抛出以下错误

 

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 )
环境
- JAX-WS 2.1.4
- JDK 1.6.0.22
maven depedency declaration 
 
条件
当server端的web service 抛出异常时,比如NEP,客户端抛出上面的ClassCastException
背景
为什么不使用JDK自带的jax-ws?
因为我们需要将sevice deploy在 tomcat中,要用到com.sun.xml.ws.transport.http.servlet.WSServletContextListener。
而com.sun.xml.ws.transport.http.servlet.* 是J2ee的一部分,并没有发布在JDK中。

起因

JAX-WS provider is loaded from JDK rt.jar com.sun.xml.internal.ws.spi.ProviderImpl,使用com.sun.xml.internal.bind.v2.* 中的class

while JAXB Context is load from Jaxb-impl-2.1.7.jar  com.sun.xml.bind.v2.ContextFactory,不是JDK自带的JAXB

源头

出现上面原因,一种可能性是应用程序的lib中加入了jaxb-impl.jar,而没有引入jaxws-rt的jar
而我们的应用已经引入了jaxws-rt(如前maven declaration)和jaxb-impl.jar,理论上都是从应用程序的依赖包中加载才对。
在灵光一现之后,发现src folder有人放了下面文件,指定JAXB为JDK的实现
         
         
|_META-INF
|_services
|_ javax.xml.ws.spi.Provider (com.sun.xml.internal.ws.spi.ProviderImpl)

解决

reomve 掉上面的META-INF folder 即可

总结

JDK中的很多API采用了service provider interface (SPI)的机制,(XML, encryption)
JDK定义上层的contract/API,并提供默认的实现,应用本身可根据需要提供自己的实现。
一般由Provider类加载不同的实现。
JAX-WS 的加载顺序
javax.xml.ws.spi.Provider provider()
  • If a resource with the name of META-INF/services/javax.xml.ws.spi.Provider
    =  com.sun.xml.ws.spi.ProviderImpl
  • $java.home/lib/jaxws.properties,it contains an entry whose key is javax.xml.ws.spi.Provider
  • If a system property with the name javax.xml.ws.spi.Provider
  • Default is loaded(com.sun.xml.internal.ws.spi.ProviderImpl)
javax.xml.bind.ContextFinder.find
  • jaxb.properties (key=javax.xml.bind.JAXBContext)
  • System property with name javax.xml.bind.JAXBContext
  • META-INF/services/javax.xml.bind.JAXBContext 
  • Default is loaded(com.sun.xml.internal.bind.v2.ContextFactory)
  
  
|_META-INF
|_services
|_ javax.xml.bind.JAXBContext (com.sun.xml.bind.v2.ContextFactory)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JAX-WS(Java API for XML Web Services)是一种用于构建和部署Web服务的Java API。JAX-WS的jar包是一组提供JAX-WS功能的Java库文件。 JAX-WS的jar包通常包含在Java开发环境(JDK)的库目录中,并可以直接使用。 使用JAX-WS的jar包可以方便地创建和部署Web服务。通过引入JAX-WS的jar包,开发人员可以使用Java语言来开发、发布和消费Web服务。 在使用JAX-WS的jar包之前,我们需要先了解几个重要的概念,例如服务端和客户端的开发、WSDL(Web Services Description Language)描述文件的生成和使用,以及通过SOAP(Simple Object Access Protocol)协议进行通信等。这些概念都是理解和使用JAX-WS的jar包的基础。 当我们在项目中使用JAX-WS的时候,需要将JAX-WS的jar包添加到项目的依赖中。在开发环境中,我们可以直接从Maven等依赖管理工具中获取这些jar包,并将其添加到项目的配置文件中。然后,我们就可以使用JAX-WS提供的类和方法来创建和使用Web服务。 JAX-WS的jar包提供了一系列的API和类,用于处理在开发和部署Web服务时所需要的各种操作,例如创建服务端和客户端的代码、解析和生成WSDL文件、进行SOAP消息的创建和解析等。 总而言之,JAX-WS的jar包为Java开发人员提供了一种简便、高效的方法来创建和使用Web服务。通过使用JAX-WS的jar包,我们可以使用Java语言方便地开发和部署Web服务,并通过SOAP协议进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FireCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值