资源描述
基于 Axis 的自定义对象序列化1. 在 Axis 服务端,注册自定义对象的序列化 /反序列化器 主要是修改 axis 安装目录下 WEB-INF/server-config.wsdd 文 件。<service name=SimpleObjectService provider=java:RPC><parameter name=allowedMethods value=*/><parameter name=className value=com.whcyit.axis.SimpleObjectService/><beanMapping languageSpecificType=java:com.whcyit.axis.SimpleObjectqname=ns:SimpleObject xmlns:ns=urn:BeanService/> </service>注意 service/beanMapping 的定义。 languageSpecificType 中定 义使用那个类 , qname 定义类的名称。 2. 在 Axis 客户端, 注册自定义对象的序列化 / 反序列化器。核心代码如下: /创建调用对象Service service = new Service();Call call = null;call = (Call) service.createCall();/注册 SimpleObject 的序列化类型QName qn = new QName(urn:BeanService,SimpleObject); call.registerTypeMapping(SimpleObject.class, qn,new BeanSerializerFactory(SimpleObject.class, qn),new BeanDeserializerFactory(SimpleObject.class,qn); 全部代码示例如下: /SimpleObject.java/Web Service 对象传递的对象,必需继承 Serializable package com.whcyit.axis;import java.io.Serializable;public class SimpleObject implements Serializable private static final long serialVersionUID = -6414428095965735488L;private int i = 0;private float f = 0.0f;private String str = ;public SimpleObject() public float getFloat() return f;public void setFloat(float f) this.f = f; public int getInt() return i;public void setInt(int i) this.i = i;public String getString() return str;public void setString(String str) this.str = str;/ SimpleObjectService.java /服务程序package com.whcyit.axis;public class SimpleObjectService public String sayHello(String name) return Hello + name +!;public String getString(SimpleObject obj) System.out.println(SimpleObjectService getString invoked!);return return by serviced:+obj.getString();public SimpleObject createSimpleObject(inti,float f,String str) System.out.println(SimpleObjectService createSimpleObject invoked!);SimpleObject so = new SimpleObject(); so.setInt(i);so.setFloat(f);so.setString(str);return so;/ SimpleObjectClient.java/客户端调用文件package com.whcyit.axis;import javax.xml.namespace.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.ser.BeanDeserializerFactory; importorg.apache.axis.encoding.ser.BeanSerializerFactory;public classpublic static void main(StringSimpleObjectClient args) String ret = try String wsdlUrl =http:/localhost:8080/axis/services/SimpleObjectService?wsdl;String nameSpaceUri =http:/localhost:8080/axis/services/SimpleObjectService;Service();Service service = newCall call = null;call = (Call) service.createCall();/注册 SimpleObject 的序列化类型QName qn = new QName(urn:BeanService,SimpleObject);call.registerTypeMapping(SimpleObject.class, qn,new BeanSerializerFactory(SimpleObject.class, qn),new BeanDeserializerFactory(SimpleObject.class, qn);/调用 sayHelloSystem.out.println(>>>sayHello);call.setOperationName(newQName(nameSpaceUri, sayHello);call.setTargetEndpointAddress(new .URL(wsdlUrl);ret = (String) call.invoke(new Object liu2 );System.out.println(return value is + ret);/ 调用 getDescSystem.out.println(>>>getString);SimpleObject so = new SimpleObject(); so.setString(hello!); QName getDescQn = new QName(nameSpaceUri, getString); call.setOperationName(getDescQn);call.setTargetEndpointAddress(new.URL(wsdlUrl);ret = (String)call.invoke(new Object so );System.out.println(return value is + ret);/调用 createSimpleObjectSystem.out.println(>>>createSimpleObject); QName getObjectQn = new QName(nameSpaceUri, createSimpleObject); call.setOperationName(getObjectQn); call.setTargetEndpointAddress(new .URL(wsdlUrl); SimpleObject rtnSO = (SimpleObject) call.invoke(new Object new Integer(1),new Float(0.1f),liu2 );System.out.println(return object +rtnSO.getString(); catch (Exception ex) ex.printStackTrace(); /server-config.wsdd/ 服务端配置文件 <?xml version=1.0 encoding=UTF-8?><deployment xmlns:java=http:/xml.apache.org/axis/wsdd/providers/java xmlns=http:/xml.apache.org/axis/wsdd/><handler type=java:org.apache.axis.handlers.http.URLMapper name=URLMapper/> <service name=SimpleObjectService provider=java:RPC> <parameter name=allowedMethods value=*/><parameter name=className value=com.whcyit.axis.SimpleObjectService/><beanMapping languageSpecificType=java:com.whcyit.axis.SimpleObject qname=ns:SimpleObjectxmlns:ns=urn:BeanService/></service><transport name=http><requestFlow><handler type=URLMapper/></requestFlow></transport></deployment>Service StylesAXIS 有四种 service styles,分别是:RPC, Document, Wrapped, and Message 最常用的就是 RPC和Message。RPC :在AXIS中是一个默认选项。当你部署的时候使用下 列两种方式: <service . provider=java:RPC> 或则 <service . style=RPC>,它遵循 SOAP RPC 和编码规 则,就是说它的 WSDL 文件形式就想上面所说的 HelloServicewsForSoap 的 echoString 一样。 每个 RPC 都包括 一个表示名称的外部接点和一些表示参数的内部接点。 AXIS 会根据规则将一个 XML(WSDL 文件)文件转化成一个 JAVA 对象,并对对想赋上在文件中描述的值。也可以根据规则将 一个 JAVA 对象转化成 XML 文件。Document以下列方式部署: <service . style=document><service . style=document> 。适 合于老的 XML schema 。Wrapped以下列方式部署: <service .style=wrapped><service . style=wrapped> 和DOCUMENT 一样,适合于老的 XML schema 。 在大多书情况下,你不许要担心是 DOCUMENT 服务还是 WRAPPED 服务。Message以下列方式部署: <service name=MessageService style=message> 。以这种方式部署的话, 会是 AXIS 失去 意义,它使你的代码真正的用 XML 形式,而不需要转化成 JAVA 对象。以这种方式部署的有以下四种服务方法:public Element method(Element bodies);public SOAPBodyElement method (SOAPBodyElement bodies);public Document method(Document body);public void method(SOAPEnvelope req, SOAPEnvelope resp);
展开阅读全文