axis客户端调用CXF服务段

实现了用axis客户端调用cxf服务端: 服务端如下:

package com.cxfserver;

import javax.jws.WebService;

import com.cxfserver.type.SayHelloInput;
import com.cxfserver.type.SayHelloOutput;

@WebService(endpointInterface = "com.cxfserver.EchoService", serviceName = "echoService")
public class EchoServiceImpl implements EchoService {

	public String broadcastEcho(String echo) {
		return "hello hold on";
	}

	public SayHelloOutput sayHello(SayHelloInput input) {
		// TODO Auto-generated method stub
		SayHelloOutput output = new SayHelloOutput();
		output.setMyAnswer("your echo:"+input.getEcho());
		output.setRandom(13);
		return output;
	}
}

 客户端代码如下:

package com.cxfserver;

import java.rmi.registry.Registry;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.TypeMapping;
import org.apache.axis.encoding.TypeMappingRegistry;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.soap.SOAPConstants;

import com.cxfserver.type.SayHelloInput;

public class DynamicClient {
	public static void main(String[] args) throws Exception {
		String endPointURI = "http://localhost:8080/cxf_server/services/EchoServiceImplPort?wsdl";
		/*{
			Service s = new Service();
			Call call = (Call)s.createCall();
			QName qn = new QName("http://cxfserver.com/", "broadcastEcho");
			call.setOperationName(qn);
			call.setTargetEndpointAddress(new java.net.URL(endPointURI));
			call.addParameter("broad", XMLType.XSD_STRING, ParameterMode.IN);
			call.setReturnType(new QName("",""),String.class);
			String [] input = {"macrox"};
			Object o = call.invoke(input);
			System.out.println("");
		}*/
		{
			Service s = new Service();
			javax.xml.rpc.encoding.TypeMappingRegistry r = s.getTypeMappingRegistry();
			javax.xml.rpc.encoding.TypeMapping map = r.getDefaultTypeMapping();
			QName qn = new QName("http://cxfserver.com/","arg0");
			QName rn = new QName("http://cxfserver.com/","sayHelloResponse");
			Class qClass = Class.forName("com.cxfserver.type.SayHelloInput");
			Class rClass = Class.forName("com.cxfserver.type.SayHelloOutput");
			
			map.register(qClass, qn, new BeanSerializerFactory(qClass,qn), new BeanDeserializerFactory(qClass,qn));
			map.register(rClass, rn, new BeanSerializerFactory(rClass,rn), new BeanDeserializerFactory(rClass,rn));
			Call call = (Call)s.createCall();
			call.setSOAPVersion(SOAPConstants.SOAP11_CONSTANTS);
			QName qne = new QName("http://cxfserver.com/", "sayHello");
			call.setOperationName(qne);
			call.setEncodingStyle(org.apache.axis.Constants.NS_PREFIX_SCHEMA_XSD);
			call.addParameter("arg0", qn, ParameterMode.IN);
			//call.setReturnQName(rn);
			call.setReturnType(rn);
			call.setUseSOAPAction(true);
			//call.addParameter("return", rn, ParameterMode.OUT);
			call.setTargetEndpointAddress(new java.net.URL(endPointURI));
			
			com.cxfserver.type.SayHelloInput input = new com.cxfserver.type.SayHelloInput();
			input.setEcho("i am client");
			input.setSay("i am client say");
			Object [] o = {input};
			Object ro = call.invoke(o);
			System.out.println("");
		}
	}
}

 如果使用默认的axis 编码方式,soap将使用 ref multip风格,cxf默认服务端将不能够解析出里面的参数:修改前的报文如下:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:sayHello soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://cxfserver.com/">
<input href="#id0"/>
</ns1:sayHello>

<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:input" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://cxfserver.com/"><echo xsi:type="soapenc:string">i am client</echo><say xsi:type="soapenc:string">i am client say</say></multiRef></soapenv:Body></soapenv:Envelope>

 修改后的代码如下:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:sayHello soapenv:encodingStyle="xsd" xmlns:ns1="http://cxfserver.com/"><arg0 xsi:type="ns1:arg0"><echo xsi:type="xsd:string">i am client</echo><say xsi:type="xsd:string">i am client say</say></arg0></ns1:sayHello></soapenv:Body></soapenv:Envelope>

猜你喜欢

转载自macrox.iteye.com/blog/1305543