|
|
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
|
|
相关文章:相关软件: |
|