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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM