1. 程式人生 > >關於axis2的RPCServiceClient客戶端無法傳參問題的解決方案

關於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的包就行,沒有挑除不需要的。

具體原因沒有仔細研究,可能問題是名稱空間無法訪問造成的吧。