大概1年多前,有個項目用到webservice,那時候研究axis時候的一些記錄,可以對比下現在的axis2或者xfire.
?????????????????????????????????????????????????????????WebService之axis的復雜對象傳輸
先自定義發布:
寫一個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?(現在看來代碼十分簡陋,那時接觸java還沒半年。不過作為一個關鍵的螺絲已經運行在學校的xx系統里面了,真的是幫了我很大的忙,還寫了個遠程通過WEB服務訪問數據庫的orm工具,地獄一樣的代碼,到處是反射)