CXF开发的接口在websphere下居然调用了AXIS2的实现 CXF开发的接口在websphere下居然调用了AXIS2的实现

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

但是里面提供了很好的思路

问题原因:开发的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

但是里面提供了很好的思路

猜你喜欢

转载自www.cnblogs.com/diaobiyong/p/9837319.html