關於axis2的RPCServiceClient客戶端無法傳參問題的解決方案
axis2方式的rpcserviceclient客戶端方式呼叫webservice一般方式如下:
import java.io.IOException;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.rpc.client.RPCServiceClient;
RPCServiceClient client = new RPCServiceClient(); Options options = client.getOptions(); String address = "http://webservice.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx"; EndpointReference epf = new EndpointReference(address); options.setAction("http://WebXml.com.cn/getAreaString"); options.setTo(epf); client.setOptions(options); QName qname = new QName("http://WebXml.com.cn/", "getAreaString"); Object[] result = client.invokeBlocking(qname, new Object[] { -4 }, new Class[] { Object.class }); // System.out.println(result[0]);
但是這種方式呼叫電視臺節目,存在無法傳參問題。別的webservice介面沒有測試過,這裡不敢下決定性的結論。但至少是訪問電視臺介面是不行的。搜尋了下資料,發現以下方式可以傳參。程式碼如下:
這種方式是採用serviceclient方式呼叫的。
// axis2方式 private static void axis2WebService() { try { String soapBindingAddress = "http://webservice.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl"; ServiceClient sender = new ServiceClient(); EndpointReference endpointReference = new EndpointReference( soapBindingAddress); Options options = new Options(); options.setAction("http://WebXml.com.cn/getTVstationDataSet"); options.setTo(endpointReference); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); // 這個和qname差不多,設定名稱空間 OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "getTVstationDataSet"); OMElement data = fac.createOMElement("getTVstationDataSet", omNs); // 對應引數的節點 String[] strs = new String[] { "theAreaID" }; // 引數值 String[] val = new String[] { "-4" }; for (int i = 0; i < strs.length; i++) { OMElement inner = fac.createOMElement(strs[i], omNs); inner.setText(val[i]); data.addChild(inner); } // 傳送資料,返回結果 OMElement result = sender.sendReceive(data); System.out.println(result.toString()); } catch (AxisFault ex) { ex.printStackTrace(); } }
所需包如如下:
activation-1.1.jar
antlr-2.7.7.jar
axiom-api-1.2.10.jar
axiom-dom-1.2.10.jar
axiom-impl-1.2.10.jar
axis2-adb-1.5.4.jar
axis2-adb-codegen-1.5.4.jar
axis2-ant-plugin-1.5.4.jar
axis2-clustering-1.5.4.jar
axis2-codegen-1.5.4.jar
axis2-corba-1.5.4.jar
axis2-fastinfoset-1.5.4.jar
axis2-java2wsdl-1.5.4.jar
axis2-jaxbri-1.5.4.jar
axis2-jaxws-1.5.4.jar
axis2-jibx-1.5.4.jar
axis2-json-1.5.4.jar
axis2-kernel-1.5.4.jar
axis2-metadata-1.5.4.jar
axis2-mtompolicy-1.5.4.jar
axis2-saaj-1.5.4.jar
axis2-soapmonitor-servlet-1.5.4.jar
axis2-spring-1.5.4.jar
axis2-transport-http-1.5.4.jar
axis2-transport-local-1.5.4.jar
axis2-xmlbeans-1.5.4.jar
bcel-5.1.jar
commons-codec-1.3.jar
commons-fileupload-1.2.jar
commons-httpclient-3.1.jar
commons-io-1.4.jar
commons-logging-1.1.1.jar
geronimo-annotation_1.0_spec-1.1.jar
geronimo-jaxws_2.1_spec-1.0.jar
geronimo-jta_1.1_spec-1.1.jar
geronimo-saaj_1.3_spec-1.0.1.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
geronimo-ws-metadata_2.0_spec-1.1.2.jar
httpcore-4.0.jar
jalopy-1.5rc3.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.7.jar
jaxb-xjc-2.1.7.jar
jaxen-1.1.1.jar
jettison-1.0-RC2.jar
jibx-bind-1.2.1.jar
jibx-run-1.2.1.jar
juli-6.0.16.jar
log4j-1.2.15.jar
mail-1.4.jar
mex-1.5.4-impl.jar
neethi-2.0.4.jar
regexp-1.2.jar
tribes-6.0.16.jar
woden-api-1.0M8.jar
woden-impl-dom-1.0M8.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.9.jar
xalan-2.7.0.jar
xercesImpl-2.8.1.jar
xml-resolver-1.2.jar
xmlbeans-2.3.0.jar
XmlSchema-1.4.3.jar
下載axis2的包就行,沒有挑除不需要的。
具體原因沒有仔細研究,可能問題是名稱空間無法訪問造成的吧。