由于最近公司采用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
闽公网安备 35060202000074号