慎用AXIS2
慎用AXIS2
java,web services,axis,apache,web,xml,rpc
?
AXIS一直是我比較喜歡的開(kāi)源產(chǎn)品,也成了開(kāi)源世界WEB SERVICE實(shí)現(xiàn)的事實(shí)標(biāo)準(zhǔn),但我一直是用的AXIS 1.x 版本,它一直工作的很好。
但最近有同事用AXIS2,卻遇到了麻煩,從而也使我有些機(jī)會(huì)去了解AXIS2,但了解的同時(shí),也對(duì)AXIS2(當(dāng)前release是1.0版,別把AXIS2后的2看成是版本號(hào))大失所望,加了一些華而不實(shí)的東西,反而把系統(tǒng)搞得很復(fù)雜,源代碼里也有不少BUG。
AXIS2自帶了Version.aar的示例,好象是返回一個(gè)STRING,可以運(yùn)行,但用它的客戶(hù)端工具自動(dòng)生成的代碼實(shí)在難看:
1、? 為什么非得封裝一個(gè)***Reponse, getMsg之類(lèi)的參數(shù)和響應(yīng)呢(使用ADB數(shù)據(jù)綁定)?在前面的版本中,生成的客戶(hù)端使用起來(lái)就象是在本地一樣(客戶(hù)端代理完全實(shí)現(xiàn)了服務(wù)端接口/或說(shuō)發(fā)布的方法簽名完成一樣),但現(xiàn)在卻不是這樣的,為了使用接口,你不得不生成一個(gè)封裝類(lèi),再將你的參數(shù)設(shè)置進(jìn)去,而返回時(shí),又不得不從***Response中顯示的獲取返回值(好像有個(gè)叫get_return之類(lèi)的方法),很是別扭。
2、? 生成客戶(hù)端時(shí)提供好幾種數(shù)據(jù)綁定方式,但我認(rèn)為沒(méi)有一種有以前的簡(jiǎn)潔,花哨不實(shí)用。
3、? 文檔太簡(jiǎn)單了,真該花點(diǎn)時(shí)間寫(xiě)些像樣的文檔,最起碼的,services.xml的DTD或Schema總得有一份呀!
接下來(lái)我們發(fā)現(xiàn),使用自定義參數(shù)(無(wú)非是自己寫(xiě)的POJO)的接口發(fā)布后無(wú)法設(shè)用成功,返回的異常信息:reader is null(大概),開(kāi)始還以為名稱(chēng)空間映射的問(wèn)題,我們的自定義參數(shù)似下面的代碼:
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;
?
??? . . . .后面略去所有Getter和Setter
}
經(jīng)過(guò)一番網(wǎng)上搜索和改配置(幾乎試了所有的選項(xiàng))/代碼之類(lèi)的操作,還是沒(méi)有找到答案,錯(cuò)誤還是發(fā)生。最好只好跟它的代碼了,過(guò)程我就不多說(shuō)了,只說(shuō)結(jié)果吧。
1、? 錯(cuò)誤發(fā)生在執(zhí)行完要返回的路了,正準(zhǔn)備將返回值序列化成SOAP消息。
2、? 在ADB的代碼中,有BeanUtils(不知道后面有沒(méi)有S),里面有getFullParser方法,也就是,在序列化過(guò)程就,要通過(guò)該方法拿到一個(gè)Reader,但該方法返回了null。
3、? 該方法里面寫(xiě)得有些粗糙,很多可能的問(wèn)題都沒(méi)有想到,比如說(shuō),上面的POJO,在返回時(shí)有些為null,這應(yīng)該是很正常的,但代碼卻假設(shè)任何一個(gè)屬性都不為null(直接調(diào)用value.toString()方法),導(dǎo)致了NullpointException,發(fā)生該異常后,未記任何日志,而是直接返回了null,導(dǎo)致客戶(hù)端跟據(jù)異常查錯(cuò)不太方便。
4、? 我們將我們的POJO改了改,對(duì)屬性均做了初始化,使返回時(shí)每個(gè)屬性都不為null,意外的時(shí),我們還是沒(méi)有成功。
5、? 這次異常還是因?yàn)?/span>getFullParser返回了null,難道不止一次調(diào)用了該方法?跟進(jìn)去!發(fā)現(xiàn)代碼是遞歸調(diào)用,即對(duì)于每個(gè)屬性,也調(diào)用了該方法,代碼里也是一堆if/else if/之類(lèi)的,對(duì)一些數(shù)據(jù)類(lèi)型進(jìn)行了處理,我發(fā)現(xiàn)在我們屬性類(lèi)型是Timestamp時(shí)返回了null,……
6、? 它的序列化返序列化算法效率也有問(wèn)題。
?
上面的過(guò)程很明顯表現(xiàn)也AXIS2是那么的不成熟不完善,代碼BUG如此明顯也是出人意料,本以為AXIS2應(yīng)該有個(gè)飛躍(至少多實(shí)現(xiàn)了幾個(gè)標(biāo)準(zhǔn)),但卻沒(méi)想到基石卻如此不牢固,建議今后別在正式的項(xiàng)目中使用。
說(shuō)到這,我又想起前段時(shí)間網(wǎng)上的一篇文章,大意也是說(shuō)AXIS如何不好的話(huà),說(shuō)是一堆研究生寫(xiě)出來(lái)的,當(dāng)時(shí)我并未在意,并一如既往的支持AXIS,直到昨天開(kāi)始接觸AXIS2,我的態(tài)度有了變化…
總結(jié)
- 上一篇: 游张孝祥老师博客(blog)有感
- 下一篇: 迅雷(XUNLEI)的工作原理揭密