axis 傳輸 簡單對象,復(fù)雜對象,List,Map等收藏
來源:http://yangzb.javaeye.com/blog/319900
那些java的對象是可以序列化為xml的, 并且可以從xml反序列化為java對象的?
那些對象與xml之間不能夠序列化和反序列化?
在開發(fā)的時候應(yīng)該注意哪些問題?
根據(jù)我的理解, 有如下幾種對象:
1)axis1.2內(nèi)在支持的幾種對象類型。
????????? 這幾種內(nèi)在支持的對象包括:
????????? java基本類型 : int, float,,,,
????????? 基本類型包裝類 : Integer, Float, Long...
????????? 還有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
???? 凡是這些內(nèi)在支持的對象, 不管他們作為某個Service的input 還是 output,
我們在服務(wù)端的axis1.2的WEB-INF/server-config.wsdd的該Service的定義中都不需要加入
<beanMapping>或者是<typeMapping>的聲明。
2)簡單的javabean對象類型。
?????? 對于簡單的javabean對象, 比如對象中所有的field都是上面提到的基本類型。 axis1.2也提供了很好的支持。
?????? 比如:
?????? public class JavaBeanInputService {
?????????? public void testJavaBeanInput(MyBean bean) {
?????????????? ......
????????? }
?????? }
???????? 由于MyBean是一個自定義的JavaBean對象,
所以在server-config.wsdd中就必須加上<beanMapping ...../>的聲明,
讓axis知道怎么把request中xml數(shù)據(jù)deserialize為MyBean對象,
又如何把MyBean對象serialize為xml數(shù)據(jù)作為response.用wtp自動為JavaInputService生成的wsdl中,
MyBean是作為一個complexType在wsdl中定義的。
3)復(fù)雜一點(diǎn)的JavaBean對象。
??????? 比如JavaBean對象中的一些field又是自定義的JavaBean,? 這種情況下,
wsdl中生成的complextype會有多個, 而在wsdd定義的<beanMapping .../>也會有多個,
axis1.2支持起來都是易如反掌。
4)普通的非javabean對象。
????? 對于一些不是javaBean的對象, wtp也會替你生成對應(yīng)的wsdl的ComplexType,
依據(jù)的是對象的getter方法。但是顯然這是不夠的。 比如說有些對象的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,
像java.util.HashMap(雖然這個已經(jīng)被axis內(nèi)在支持了。)這些對象如果想要把自己的狀態(tài)進(jìn)行serialization和
deserialization, 就得自己編寫serializer和deserializer,?
而且還必須保證wsdl中的該complexType的描述是正確的。
5)java中的List, Map問題。
?????? 試想一下如果一個service的樣子是這樣子的。
?????? public class ListService{
???????????? public List listTest(List list) {
??????????????????? for(Iterator iter = list.iterator(); iter.hasNext(); ) {
?????????????????????????? (MyBean)list.next();//進(jìn)行強(qiáng)轉(zhuǎn)。
??????????????????? }
????????????? }
?????? }
??????? 用wtp為這個service生成的wsdl中把list映射為一個type為xsd:anyType的maxOccurs="unbound"的complexType。這樣的話客戶端生成的Stub中的接口中類似于:
??????? public interface ListService{
???????????? public Object[] listTest(Object[] list) ;
??????? }
??????? 如果Client端用戶傳遞的入口參數(shù)是String[],那么在服務(wù)端執(zhí)行的必然會發(fā)生轉(zhuǎn)型錯誤。
??????? 因此,在webservice中把List, Map作為service的input, output的做法都是不可行的。至少在jdk1.4的版本中是這樣的。
??????? 一個更好的方法就是:
6)java中的數(shù)組。
????? 上例中的ListService如果改造為下面這樣,基本上就沒有上面提到的問題了。
????? public class ListService{
???????????? public MyBean[] listTest(MyBean[] list) {
?????????????????? ...
???????????? }
?????? }
??????? 這樣在wsdl中,
MyBean被映射為一種ComplexType,MyBean[]為映射為ComplexType為映射為可以重復(fù)出現(xiàn)的MyBean類型。在客戶端的
Stub的接口跟這個也是類似的。從而也成功地避免了List, Map中型別問題。
?????? 要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
?????? 似乎List, Map的問題用數(shù)組就可以解決了。事實(shí)上就是如此。但是還得注意的是:
javabean里邊也不能含有List. 如果MyBean跟其它某個對象是1:n的關(guān)系,那么也只能寫成數(shù)組的形式,而不能是List的形式。
7)特殊對象java.lang.Object
?????? 如果一個service寫成了下面的形式:
?????? public class ObjectService{
???????????? public Object objInvoke(Object obj) {
?????????????????? ...
???????????? }
?????? }
??????? 想把它發(fā)布為web service,
那么幾乎是不太可能的。遇到obj類型,wsdl里邊只能定義為xsd:anyType類型,而這種類型如果給客戶端返回一個比如MyBean類型,那么
必然會導(dǎo)致xml的serialization的失敗。結(jié)論就是:
???????? web service中如果input 或者是output是java.lang.Object類型,那么將會導(dǎo)致嚴(yán)重問題。
???????
??????? 上 面的幾種對象類型基本上能夠涵蓋將java class發(fā)布為web
service時需要考慮的對象類型。可以看到開發(fā)web service的時候,并不是所有的java都能夠輕而易舉地發(fā)布為web
service, 一些復(fù)雜的類的對象類型,還有一些特殊的對象類型都是要考慮的。最后一個問題是:子類是否也很容易的得到序列化和反序列化?
???????? 答案是肯定的。如下的Service:
????????? public class PolymorphicService{
???????????? public MyBean objInvoke(MyBean obj) {
?????????????????? ...
???????????? }
???????? }
????????? 客戶端的Stub如下:
????????? public class PolymorphicServiceStub{
???????????? public MyBean objInvoke(MyBean obj) {
?????????????????? ...
???????????? }
???????? }
???????? 如果在客戶端調(diào)用stub時傳入的不是MyBean類的對象,而是它的子類的一個對象,那么也可以被序列化而傳到服務(wù)端。同樣,如果服務(wù)端返回的對象是MyBean類的字類的一個對象,也可以成功的被序列化到客戶端。
posted on 2009-05-25 11:13
收藏也是種愛好 閱讀(1045)
評論(0) 編輯 收藏 引用 所屬分類:
Java