慎用AXIS2

慎用AXIS2

java,web services,axis,apache,web,xml,rpc

 

AXIS一直是我比較喜歡的開源產品,也成了開源世界WEB SERVICE實現的事實標準,但我一直是用的AXIS 1.x 版本,它一直工作的很好。

但最近有同事用AXIS2,卻遇到了麻煩,從而也使我有些機會去了解AXIS2,但瞭解的同時,也對AXIS2(當前release1.0版,別把AXIS2後的2看成是版本號)大失所望,加了一些華而不實的東西,反而把系統搞得很複雜,源代碼裏也有不少BUG

AXIS2自帶了Version.aar的示例,好象是返回一個STRING,可以運行,但用它的客戶端工具自動生成的代碼實在難看:

1、  爲什麼非得封裝一個***Reponse, getMsg之類的參數和響應呢(使用ADB數據綁定)?在前面的版本中,生成的客戶端使用起來就象是在本地一樣(客戶端代理完全實現了服務端接口/或說發佈的方法簽名完成一樣),但現在卻不是這樣的,爲了使用接口,你不得不生成一個封裝類,再將你的參數設置進去,而返回時,又不得不從***Response中顯示的獲取返回值(好像有個叫get_return之類的方法),很是彆扭。

2、  生成客戶端時提供好幾種數據綁定方式,但我認爲沒有一種有以前的簡潔,花哨不實用。

3、  文檔太簡單了,真該花點時間寫些像樣的文檔,最起碼的,services.xmlDTDSchema總得有一份呀!

接下來我們發現,使用自定義參數(無非是自己寫的POJO)的接口發佈後無法設用成功,返回的異常信息:reader is null(大概),開始還以爲名稱空間映射的問題,我們的自定義參數似下面的代碼:

package com.mudboy.model;

import java.sql.Date;

import java.sql.Timestamp;

public class Message implements java.io.Serializable

{

    private static final long serialVersionUID = 1L;

    private Date actidate;

    private Integer flight_no;

    private Timestampa_or_d;

    private String d_or_i;

    private String etd_time;

    private String atd_time;

private String eta_time;

 

    . . . .後面略去所有GetterSetter

}

經過一番網上搜索和改配置(幾乎試了所有的選項)/代碼之類的操作,還是沒有找到答案,錯誤還是發生。最好只好跟它的代碼了,過程我就不多說了,只說結果吧。

1、  錯誤發生在執行完要返回的路了,正準備將返回值序列化成SOAP消息。

2、  ADB的代碼中,有BeanUtils(不知道後面有沒有S),裏面有getFullParser方法,也就是,在序列化過程就,要通過該方法拿到一個Reader,但該方法返回了null

3、  該方法裏面寫得有些粗糙,很多可能的問題都沒有想到,比如說,上面的POJO,在返回時有些爲null,這應該是很正常的,但代碼卻假設任何一個屬性都不爲null(直接調用value.toString()方法),導致了NullpointException,發生該異常後,未記任何日誌,而是直接返回了null,導致客戶端跟據異常查錯不太方便。

4、  我們將我們的POJO改了改,對屬性均做了初始化,使返回時每個屬性都不爲null,意外的時,我們還是沒有成功。

5、  這次異常還是因爲getFullParser返回了null,難道不止一次調用了該方法?跟進去!發現代碼是遞歸調用,即對於每個屬性,也調用了該方法,代碼裏也是一堆if/else if/之類的,對一些數據類型進行了處理,我發現在我們屬性類型是Timestamp時返回了null……

6、  它的序列化返序列化算法效率也有問題。

 

上面的過程很明顯表現也AXIS2是那麼的不成熟不完善,代碼BUG如此明顯也是出人意料,本以爲AXIS2應該有個飛躍(至少多實現了幾個標準),但卻沒想到基石卻如此不牢固,建議今後別在正式的項目中使用。

說到這,我又想起前段時間網上的一篇文章,大意也是說AXIS如何不好的話,說是一堆研究生寫出來的,當時我並未在意,並一如既往的支持AXIS,直到昨天開始接觸AXIS2,我的態度有了變化

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章