最近在使用AXIS2部署Web Service,關(guān)于如果使用axis2部署Web Service的方法不想在這里多說(shuō),網(wǎng)站有很多相關(guān)的文章,這里只想談?wù)凙XIOM對(duì)象與Java中的對(duì)象的轉(zhuǎn)換方法。 關(guān)于AXIOM的介紹,下面這個(gè)片段已經(jīng)說(shuō)得很明白了: AXIs 對(duì)象模型 (AXIOM) 是一個(gè) XML 對(duì)象模型,設(shè)計(jì)用于提高 XML 處理期間的內(nèi)存使用率和性能,基于 Pull 解析。通過(guò)使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱為 OM)可以控制解析過(guò)程,以提供延遲構(gòu)建支持。延遲構(gòu)建是指 AXIOM 不完全構(gòu)建對(duì)象模型,模型的其余部分基于用戶的需求構(gòu)建。以下示例對(duì)此概念進(jìn)行了說(shuō)明:
假定某個(gè)用戶需要從 XML 輸入流中獲得第一個(gè)人的
這里的優(yōu)勢(shì)在于,盡可能僅使用能滿足用戶的需求的內(nèi)存。如果用戶希望訪問(wèn)較大的文檔中前面的數(shù)個(gè)字節(jié)或數(shù)千字節(jié),則延遲構(gòu)建功能將改善該應(yīng)用程序的內(nèi)存需求情況。 可以從任何元素獲得 StAX 事件,而不管是否完整構(gòu)建了對(duì)象模型。在有些情況下,Axis 2 中的此功能非常有用。例如,當(dāng) Axis2 作為中介傳遞時(shí),如果需要僅讀取 SOAP 消息的 Header,AXIOM 將防止其讀取整個(gè) SOAP 消息,使其具有很高的內(nèi)存效率。另一個(gè)例子是,當(dāng) Web 服務(wù)實(shí)現(xiàn)能夠直接使用 StAX 事件時(shí),由于采用了 AXIOM,Web 服務(wù)所需的內(nèi)存非常小。 此外,AXIOM 內(nèi)置了消息傳輸優(yōu)化機(jī)制(Message Transfer Optimization Mechanism,MTOM)支持。對(duì)于 AXIOM 體系結(jié)構(gòu),可以通過(guò)實(shí)現(xiàn) AXIOM 接口并將其插入到 Axis2 中來(lái)執(zhí)行自己的對(duì)象模型。
由于 AXIOM 最初是作為 Axis2 的對(duì)象模型而開發(fā)的,因此 AXIOM 提供了構(gòu)建于基礎(chǔ) AXIOM API 之上的 SOAP 接口。這允許您使用 AXIS2會(huì)將Web Service方法中的參數(shù)或返回值中的自定義對(duì)象、數(shù)組、List等類型統(tǒng)一映射為OMElement類型,這就我們需要編寫OMElement與自定義類型質(zhì)檢的轉(zhuǎn)換方法,下面給出幾個(gè)常用的方法: CASE1:自定義對(duì)象生成OMElement方法:
Person man = new Person(); CASE2:List或Array類型生成OMElement方法:
List<Person> list = new ArrayList<Person>(); CASE3:解析包含基本類型的List或Array生成的OMElement的方法:
private static List<String> getResults(OMElement element) { CASE4:解析包含自定義Java類型的List或Array的方法:
private static List<Person> getResults(OMElement element) throws AxisFault {
ps: 在現(xiàn)在項(xiàng)目中使用axis2,發(fā)現(xiàn)其源碼有一個(gè)問(wèn)題:
在org.apache.axis2.databinding.utils.BeanUtil.java-500 line 可以看到,在第500行進(jìn)行了一個(gè)toLowerCase()轉(zhuǎn)換,導(dǎo)致自定義類型的轉(zhuǎn)換出現(xiàn)bean屬性丟失, 將它去掉,重新打包就可以正常運(yùn)行了; 不明白為什么axis2工作小組要進(jìn)行這樣處理呢; 不知道這算不算一個(gè)bug,總不能就規(guī)定我們只能使用全部小寫字母來(lái)定義bean屬性吧,有違java編碼規(guī)范啊; 看來(lái)要給apache反應(yīng)一下 |
|
來(lái)自: ebonyzhang > 《技術(shù)》