关于在java6中使用XFire时碰到的一个问题Could not initialize Service

在一个采用了XFire作为WebService框架Web项目中,添加由JDK1.6 wsimport命令生成的一个WebService客户端调用,在客户端调用时出现了如下问题

log4j:WARN No appenders could be found for logger (org.codehaus.xfire.jaxws.Provider).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.IllegalStateException: Could not initialize Service.
	at org.codehaus.xfire.jaxws.ServiceDelegate.<init>(ServiceDelegate.java:77)
	at org.codehaus.xfire.jaxws.Provider.createServiceDelegate(Provider.java:32)
	at javax.xml.ws.Service.<init>(Service.java:56)
	at com.xxx.xxx..XXXService.<init>(XXXService.java:48)
	at com.xxx.xxx..main(Test.java:8)
Caused by: java.lang.NoSuchMethodException: com.xxx.xxx.getPortClassMap()
	at java.lang.Class.getMethod(Class.java:1607)
	at org.codehaus.xfire.jaxws.ServiceDelegate.<init>(ServiceDelegate.java:60)
	... 4 more

根据错误信息来看,是由于getPortClassMap()方法未找到,导致Could not initialize Service;但是我的客户端是用jdk自带的wsimport生成的,为什么在方法执行过程中会调用XFire相关的代码呢?

再仔细看错误提示,javax.xml.ws.Service.<init>(Service.java:56),原来是这里出了问题,

    protected Service(java.net.URL wsdlDocumentLocation, QName serviceName) {
        delegate = Provider.provider().createServiceDelegate(wsdlDocumentLocation,
                serviceName,
                this.getClass());
    }

在这个地方调用Provider的方法,而Provider在jdk6中是一个抽象类,jdk6有该类的子类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去执行。

那么现在该问题解决方式就是把javax.xml.ws.spi.Provider文件中的

org.codehaus.xfire.jaxws.Provider
改为
com.sun.xml.internal.ws.spi.ProviderImpl

就可以了。

这样java6的wsimport生成的客户端就不会再条用XFire相关的代码了。


本文章只记录了该问题的现象和解决方法。


关于本文章记录的解决方法的原理介绍可参考:

http://blog.csdn.net/fenglibing/article/details/7083071

http://blog.csdn.net/conquer0715/article/details/50728458


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值