CXF开发的接口在websphere下居然调用了AXIS2的实现
问题原因:开发的cxf接口,在本地tomcat下没有问题,部署到websphere下有的时候没有问题,有的时候重启后就出现问题
日志如下:
Caused by: javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism.
at org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:175)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:128)
at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:586)
at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:130)
at org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93)
at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:391)
at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:208)
at $Proxy100.invoke(Unknown Source)
at com.scms.epms.buyapply.action.BuyApplyActivator.buyApplyClient(BuyApplyActivator.java:86)
at com.huaxin.gs.sysinterface.InitInterfaceService.buyaply(InitInterfaceService.java:64)
at com.huaxin.gs.sysinterface.InitInterfaceService.doInitInterfaceData(InitInterfaceService.java:49)
... 55 more
发现问题,很是奇怪,我们明明用的是cxf 怎么日志是axis2的呢?然后在本地用soapui模拟接口跟踪代码发现并没有走axis2,也看了应用lib里并没有axis2的jar。
问题应该出在了websphere加载机制里面了。确定好了问题那么就跟着源码看看,为什么我们的接口在websphere会调用axis2呢?
根据报错代码 com.scms.epms.buyapply.action.BuyApplyActivator.buyApplyClient(BuyApplyActivator.java:86) 我们发现自动生成的客户端代码都调用了
javax.xml.ws.Service 类的 Provider provider() 方法
方法里面有
我们可以看到JAX-WS 2.0 的实现是根据
Object provider =FactoryFinder.find(JAXWSPROVIDER_PROPERTY,DEFAULT_JAXWSPROVIDER);来查找实现类的,默认使用javax.xml.ws.spi.Provider的实现类com.sun.xml.internal.ws.spi.ProviderImpl
优先实现类的顺序 如图
而我们系统META-INF下面没有配置。而websphere下面的自带了JAX-WS 2.0的 实现 AXIS2
此org.apache.axis2.jar下面的services下的的javax.xml.ws.spi.Provider 文件里有org.apache.axis2.jaxws.spi.Provider实现。根据日志确实走了这个的实现。
那么我们如何修改呢?
直接在应用下新建
META-INF/services/javax.xml.ws.spi.Provider 文件
文件里面用org.apache.cxf.jaxws.spi.Provider即可。一切OK
之前也走了弯路,发现里面的解决方法都不可行。连接在这里http://www.bubuko.com/infodetail-279125.html
但是里面提供了很好的思路
posted on 2018-01-15 15:55 diaobiyong 阅读(312) 评论(0) 编辑 收藏 举报