关于axis2的RPCServiceClient客户端无法传参问题的解决方案

本内容链接上一篇博客。关于如何访问webservice的问题


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

具体原因没有仔细研究,可能问题是命名空间无法访问造成的吧。

你可能感兴趣的:(webservice)