今天遇到一件詭異的事情,打好的同一個aar包,丟到測試環境tomcat,使用soapui測試,正常反饋結果。
丟到本地tomcat,使用soapui測試,始終報以下錯誤。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <soapenv:Fault> <faultcode>soapenv:Server</faultcode> <faultstring>The ServiceClass object does not implement the required method in the following form: OMElement sayHello(OMElement e)</faultstring> <detail/> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>
查找該錯誤,所有的解決方案均指向需要在aar工程中配置service.xml文件。
但是,我是同一個包啊,測試環境不需要service.xml就能正確運行,沒道理放到本地環境中不行啊。
於是再將測試環境中的axis2.xml替換掉本地的axis2.xml,發現serverlist中一個服務都沒有了。
后來猜測是不是版本的原因,查看測試環境中的版本,axis2 1.6.0,本地版本axis2 1.7.3.
於是下載1.6.0至本地環境,無需配置service.xml即能正確運行soapui進行測試。
這個太坑了,新版本竟然不支持不配置service的方式。
修改與2017/04/19
抱歉,前面的解釋沒經過仔細的試驗,在經過試驗之后得出以下結論
生成aar包的Service Archive plugin的版本需要不高於服務器上運行時的axis2的版本才能正確的運行服務。
建議:服務器運行時版本與生成服務包的版本保持一致。
如果不確定服務器運行時的axis2版本,可以通過webapps/axis2/WEB-INF/services查看,或者使用http://server:port/axis2/services/Version?wsdl獲取版本號。
修改於2017/04/20
上述問題經過再次在java代碼中使用RPCClient的方式調用。
分別使用
a.先打jar包,再改后綴為aar,最后手工編輯services.xml的方式生成aar包(手工生成AXIS2的aar文件)
b.直接使用Serveice Archive plugin插件生成aar包的方式
進行了測試。
測試結果如下。
a.
b.
。
通過對比發現使用,
插件1.6.2生成的service.xml內容如下:
<service name="HelloServer" > <description> Please Type your service description here </description> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> </messageReceivers> <parameter name="ServiceClass">com.hongbo.server.HelloServer</parameter> </service>
插件1.7.4生成的service.xml內容如下:
<service name="HelloServer" > <description> Please Type your service description here </description> <messageReceivers> <messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> </messageReceivers> <parameter name="ServiceClass">com.hongbo.server.HelloServer</parameter> </service>
關於MEP的解釋: