实现了用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>