当前位置: 代码迷 >> Web前端 >> 调用非本机WebService时传到自定义对象参数的解决方案
  详细解决方案

调用非本机WebService时传到自定义对象参数的解决方案

热度:83   发布时间:2012-10-31 14:37:31.0
调用非本机WebService时传入自定义对象参数的解决方案

问题描述:

由于业务需要,我们在服务器A上发布了一些WebService供开发人员调用,其中一个WebService有一个方法是以自定义对象为方法参数的,当我们在客户机调用此方法时,报出了No serializabler for class 之类的错误,大致的意思是不能为本机类找到序列化器,这个本机类是我在客户机上编写的一个类,用来和服务器上的类相对应,其中属性方法全部一致。

解决方案:

1?? 在服务器上的server-config.wsdd中的相应service(你要进行调用的service)添加一个<beanMapping>元素,就像下面这样:

xml 代码
  1. <service?name="Hzwh"?provider="java:RPC">?? ??
  2. ????????<parameter?name="methodName"?value="*"/>?? ??
  3. ????????<parameter?name="className"?value="shout.xtgl.Hzwh"/>?? ??
  4. ????????<beanMapping?languageSpecificType="java:shout.pub.PubRtn"?qname="ns1:PubRtn"?xmlns:ns1="urn:BeanService"/>?? ??
  5. ????????<beanMapping?languageSpecificType="java:shout.pub.PubArg"?qname="ns2:PubArg"?xmlns:ns2="urn:BeanService"/>?? ??
  6. ????????<beanMapping?languageSpecificType="java:shout.db.CoHzml"?qname="ns3:CoHzml"?xmlns:ns3="urn:BeanService"/>?? ??
  7. ????<?/service>????

?

2? 在客户机上注册本机上的类与服务器上的WebService提供类提供关联。我是在jsp代码里调用WebService的,所以看起来就像这样:

java 代码
  1. ??????????? //要调用的WebService?URL地址 ??
  2. ????????????String?endpoint?=?"http://yan:8088/server/axis/Hzwh?wsdl"; ??
  3. ????????????Service?service?=?new?Service(); ??
  4. ????????????Call?call?=?(Call)?service.createCall(); ??
  5. ????????????//参数1对应<beanMapping>的xmlns:ns属性,参数2对应<beanMapping>的qname属性 ??
  6. ????????????QName?name?=?new?QName("urn:BeanService",?"CoHzml");??
  7. ??????????? //CoHzml是本机上的类,注册本机类,使其与服务提供类对应起来?
  8. ????????????call.registerTypeMapping(CoHzml.class,?name, ??
  9. ????????????????????new?BeanSerializerFactory(CoHzml.class,?name), ??
  10. ????????????????????new?BeanDeserializerFactory(CoHzml.class,?name)); ??
  11. ????????????call.setTargetEndpointAddress(new?java.net.URL(endpoint)); ??
  12. ????????????//填写你要调用的方法名称? ??
  13. ????????????call.setOperationName("add"); ??
  14. ????????????//CoHzml是自定义的与服务提供类相对应的类 ??
  15. ????????????CoHzml?hzml?=?new?CoHzml(); ??
  16. ????????????hzml.ascm?=?"1"; ??
  17. ????????????hzml.hz?=?"我"; ??
  18. ????????????hzml.id?=?6; ??
  19. ????????????hzml.pym?=?"w"; ??
  20. ????????????hzml.wbm?=?"2"; ??
  21. ????????????//传入参数 ??
  22. ????????????String?str?=?(String)?call.invoke(new?Object[]?{?hzml?}); ??
  23. ????????????System.out.println(str);??

?

3? 如果返回的也是自定义对象,那么方法大同小异。只不过在第2步的Java代码21行中返回客户机与服务提供类相对应的类。

有什么疑问的欢迎大家留言。。。。

  相关解决方案