服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

技术剖析:基于axis的自定义对象序列化


  由于最近公司采用web services技术做企业应用集成(eai)相关的项目,有关技术人员反应采用axis不能传递用户自定义对象。
  
  错误信息大体如下:
  
  axisfault
  
  faultcode: {http://schemas.xmlsoap.org/soap/envelope/}server.userexception
  
  faultsubcode:
  
  faultstring: java.io.ioexception: no serializer found for class com.whcyit.axis.simpleobject in registry org.apache.axis.encoding.typemappingdelegate@da3a1e
  
  faultactor:
  
  faultnode:
  
  faultdetail:
  
  {http://xml.apache.org/axis/}stacktrace:java.io.ioexception: no serializer found for class com.whcyit.axis.simpleobject in registry org.apache.axis.encoding.typemappingdelegate@da3a1e
  
  at org.apache.axis.encoding.serializationcontext.serializeactual(serializationcontext.java:1429)
  
  对于web services的接触已经是4年多前的事情了,基本上对于web services只是存在一个概念了。抱着疑问,决定自己试一下到底怎么回事?
  
  最后通过2个多小时的测试,终于把问题解决了。解决方式如下:
  
  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.simpleobject" qname="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对象传递的对象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(int i,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;import org.apache.axis.encoding.ser.beanserializerfactory; public class simpleobjectclient {   /**  * @param args  */  public static void main(string[] args) {  string ret = "";  try {  string wsdlurl = "http://localhost:8080/axis/services/simpleobjectservice?wsdl";  string namespaceuri = "http://localhost:8080/axis/services/simpleobjectservice";  //string wsdlurl = "http://10.68.19.24:8080/sample/services/simpleobjectservice?wsdl";  //string namespaceuri = "http://10.68.19.24:8080/sample/services/simpleobjectservice";   //创建调用对象  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));   //调用sayhello  system.out.println(">>>sayhello");  call.setoperationname(new qname(namespaceuri, "sayhello"));  call.settargetendpointaddress(new java.net.url(wsdlurl));   ret = (string) call.invoke(new object[] { "liu2" });  system.out.println("return value is " + ret);    //调用getdesc  system.out.println(">>>getstring");  simpleobject so = new simpleobject();  so.setstring("hello!");  qname getdescqn = new qname(namespaceuri, "getstring");   call.setoperationname(getdescqn);  call.settargetendpointaddress(new java.net.url(wsdlurl));  ret = (string) call.invoke(new object[] { so });  system.out.println("return value is " + ret);    //调用createsimpleobject  system.out.println(">>>createsimpleobject");  qname getobjectqn = new qname(namespaceuri, "createsimpleobject");   call.setoperationname(getobjectqn);  call.settargetendpointaddress(new java.net.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="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalconfiguration> <parameter name="adminpassword" value="admin"/> <parameter name="attachments.directory" value="c:/eclipse/workspace/bookstore/web-inf/attachments"/> <parameter name="attachments.implementation" value="org.apache.axis.attachments.attachmentsimpl"/> <parameter name="sendxsitypes" value="true"/> <parameter name="sendmultirefs" value="true"/> <parameter name="sendxmldeclaration" value="true"/> <parameter name="axis.sendminimizedelements" value="true"/> <requestflow>  <handler type="java:org.apache.axis.handlers.jwshandler">  <parameter name="scope" value="session"/>  </handler>  <handler type="java:org.apache.axis.handlers.jwshandler">  <parameter name="scope" value="request"/>  <parameter name="extension" value=".jwr"/>  </handler> </requestflow> </globalconfiguration> <handler name="localresponder" type="java:org.apache.axis.transport.local.localresponder"/> <handler name="authenticate" type="java:org.apache.axis.handlers.simpleauthenticationhandler"/> <handler name="urlmapper" type="java:org.apache.axis.handlers.http.urlmapper"/> <service name="version" provider="java:rpc"> <parameter name="allowedmethods" value="getversion"/> <parameter name="classname" value="org.apache.axis.version"/> </service> <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:simpleobject" xmlns:ns="urn:beanservice"/> </service> <service name="adminservice" provider="java:msg"> <parameter name="allowedmethods" value="adminservice"/> <parameter name="enableremoteadmin" value="false"/> <parameter name="classname" value="org.a

扫描关注微信公众号