编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

JDK的JAX-WS和Xfire同时使用报错:Could not initialize Service

wxchong 2024-10-09 21:24:30 开源技术 30 ℃ 0 评论

前几天的文章整合Spring和XFire:Spring整合xfire框架,发布wsdl服务

之后发现项目中又出现问题了,之前项目中用到基于JDK实现的webservice服务端和客户端,通过Jax-ws客户端调用Jax-ws服务端的时候老是报如下图的错误:

然后就发现是xfire和jax-ws有冲突。

问题的原因:

通过报错发现getPortClassMap()方法未找到,导致Could not initialize Service。

JDK创建 Service 的代理的时候没有使用 jdk 自带的 javax.xml.ws.spi.Provider,而是使用了 xfire 包中的 javax.xml.ws.spi.Provider。

而Provider在jdk中是一个抽象类,jdk有该类的子类com.sun.xml.internal.ws.spi.ProviderImpl,

XFire也有一个该类的子类org.codehaus.xfire.jaxws.Provider,并且在xfire-all-1.2.6.jar包中/META-INF/services/javax.xml.ws.spi.Provider的文件里,指定了由org.codehaus.xfire.jaxws.Provider去执行,所以冲突了。

解决方法:

通过解压软件将xfire-all-1.2.6.jar解压之后会出现四个文件如下图:

然后找到META-INF中的services文件下的 “javax.xml.ws.spi.Provider” 文件,通过记事本或者notepad++等打开它,

里面就一句话:org.codehaus.xfire.jaxws.Provider 。将这句话改为:com.sun.xml.internal.ws.spi.ProviderImpl保存就好。


问题来了。。

怎么将这个四个文件还打包成jar?

从网上找了找有两个方法:通过jdk的jar命令和用eclipse导出,但是发现都不太好弄。

最简单的方法:用压缩软件将之前的jar打开,不是解压,然后将修改的“javax.xml.ws.spi.Provider” 文件还拖到之前的位置,然后替换保存即可。

工作中遇到的问题记录一下。

不定时更新,如果感觉有用关注一波。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表