问题描述:
由于业务需要,我们在服务器A上发布了一些WebService供开发人员调用,其中一个WebService有一个方法是以自定义对象为方法参数的,当我们在客户机调用此方法时,报出了No serializabler for class 之类的错误,大致的意思是不能为本机类找到序列化器,这个本机类是我在客户机上编写的一个类,用来和服务器上的类相对应,其中属性方法全部一致。
解决方案:
1?? 在服务器上的server-config.wsdd中的相应service(你要进行调用的service)添加一个<beanMapping>元素,就像下面这样:
xml 代码
- <service?name="Hzwh"?provider="java:RPC">?? ??
- ????????<parameter?name="methodName"?value="*"/>?? ??
- ????????<parameter?name="className"?value="shout.xtgl.Hzwh"/>?? ??
- ????????<beanMapping?languageSpecificType="java:shout.pub.PubRtn"?qname="ns1:PubRtn"?xmlns:ns1="urn:BeanService"/>?? ??
- ????????<beanMapping?languageSpecificType="java:shout.pub.PubArg"?qname="ns2:PubArg"?xmlns:ns2="urn:BeanService"/>?? ??
- ????????<beanMapping?languageSpecificType="java:shout.db.CoHzml"?qname="ns3:CoHzml"?xmlns:ns3="urn:BeanService"/>?? ??
- ????<?/service>????
?
2? 在客户机上注册本机上的类与服务器上的WebService提供类提供关联。我是在jsp代码里调用WebService的,所以看起来就像这样:
java 代码
- ??????????? //要调用的WebService?URL地址 ??
- ????????????String?endpoint?=?"http://yan:8088/server/axis/Hzwh?wsdl"; ??
- ????????????Service?service?=?new?Service(); ??
- ????????????Call?call?=?(Call)?service.createCall(); ??
- ????????????//参数1对应<beanMapping>的xmlns:ns属性,参数2对应<beanMapping>的qname属性 ??
- ????????????QName?name?=?new?QName("urn:BeanService",?"CoHzml");??
- ??????????? //CoHzml是本机上的类,注册本机类,使其与服务提供类对应起来?
- ????????????call.registerTypeMapping(CoHzml.class,?name, ??
- ????????????????????new?BeanSerializerFactory(CoHzml.class,?name), ??
- ????????????????????new?BeanDeserializerFactory(CoHzml.class,?name)); ??
- ????????????call.setTargetEndpointAddress(new?java.net.URL(endpoint)); ??
- ????????????//填写你要调用的方法名称? ??
- ????????????call.setOperationName("add"); ??
- ????????????//CoHzml是自定义的与服务提供类相对应的类 ??
- ????????????CoHzml?hzml?=?new?CoHzml(); ??
- ????????????hzml.ascm?=?"1"; ??
- ????????????hzml.hz?=?"我"; ??
- ????????????hzml.id?=?6; ??
- ????????????hzml.pym?=?"w"; ??
- ????????????hzml.wbm?=?"2"; ??
- ????????????//传入参数 ??
- ????????????String?str?=?(String)?call.invoke(new?Object[]?{?hzml?}); ??
- ????????????System.out.println(str);??
?
3? 如果返回的也是自定义对象,那么方法大同小异。只不过在第2步的Java代码21行中返回客户机与服务提供类相对应的类。
有什么疑问的欢迎大家留言。。。。