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