| 
         
     
     | 
     | 
    
  
    | 
    WebService之axis的复杂对象传输 | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    先自定义发布:  写一个deploy.wsdd 文件: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="mShop" provider="java:RPC"> <parameter name="className" value="tests.shop"/> <parameter name="allowedMethods" value="*"/> <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"  encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  qname="ns1:book"  serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"  type="java:tests.book" xmlns:ns1="http://127.0.0.1:8080/axis/services/mShop"/> </service> </deployment>
  服务发布后,以上的发布信息都会被添加到server-config.wsdd文件里~ 若服务发布出了什么问题(比如View里面看不到任何服务等……==!)一个考虑的就是这个server-config.wsdd~ 上面的高亮显示,这是关键,它在server端定义如何序列化和反序列化complexType 若没有这个,那么你在客户端registry.getDefaultTypeMapping()将什么都得不到~~
  这里的<typeMapping .../>定义了一个book对象,它是服务方法 public book[] getAllBooks() 的返回类型,类定义在tests.book,namespace是服务的namespace 具体的wsdd文件说明在axisUserguide里面,具体位置 : %axis_home%/docs/reference.html 以此类推,服务中所有的非原子类型返回都必须typeMapping一下~~~(= =!汗)
  注册复杂类型的客户端代码:
 
  org.apache.axis.client.Service service = new org.apache.axis.client.Service(); TypeMappingRegistry registry = service.getTypeMappingRegistry(); TypeMapping map = registry.getDefaultTypeMapping(); QName qType = new QName("http://localhost/tests","book"); Class qClass = Class.forName("tests.book"); map.register(qClass,qType,new BeanSerializerFactory(qClass, qType), new BeanDeserializerFactory(qClass, qType));
  要注意,Service是org.apache.axis.client.Service,而不是javax.xml.rpc.Service,如果用错了axis会发出一大堆http500来抱怨的~~~
  附:自己写的一个类来远程调用axis的服务,省得一个个去service啊call啊的. axisGo.rar 
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |