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
但是里面提供了很好的思路