小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

AXIS2中OMElement和Java對(duì)象之間的轉(zhuǎn)換 分享

 ebonyzhang 2016-07-20

 最近在使用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ō)得很明白了:

AXIOM

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è)人的 <Location> 元素值,AXIOM 構(gòu)建的對(duì)象模型將一直包含到<Location> 元素結(jié)束的內(nèi)容,而讓其他內(nèi)容保留在流中:


清單 1. 對(duì)象模型的 AXIOM 部分構(gòu)建

				
<Persons>
  <Person>
     <Name>Dihini Himahansi</Name>
     <Sex>Female</Sex>
     <Location>Colombo, Sri Lanka</Location>  
     <--- Object model is being built only up to this point
  </Person>
  <Person>
     <Name>Thushari Damayanthi</Name>
     <Sex>Female</Sex>
     <Location>Elpitiya, Sri Lanka</Location>
  </Person>
</Persons>

這里的優(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 接口。這允許您使用 envelope.getHeaders 和 envelope.getBody 之類的便利方法查看 SOAP。

AXIS2會(huì)將Web Service方法中的參數(shù)或返回值中的自定義對(duì)象、數(shù)組、List等類型統(tǒng)一映射為OMElement類型,這就我們需要編寫OMElement與自定義類型質(zhì)檢的轉(zhuǎn)換方法,下面給出幾個(gè)常用的方法:

CASE1:自定義對(duì)象生成OMElement方法:

  Person man = new Person();
  man.setName("Warlaze");
  man.setAge(25);
  man.setAddress("Bei jing");
  man.setPhonenum("13900000000");
  javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(man);
  StreamWrapper parser = new StreamWrapper(reader);
  StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory.getOMFactory(), parser);
  OMElement element = stAXOMBuilder.getDocumentElement();

CASE2:List或Array類型生成OMElement方法:

  List<Person> list = new ArrayList<Person>();
  list.add(man);
  list.add(man);
  OMElement omElement = BeanUtil.getOMElement(new QName("root"), list
    .toArray(), new QName("person"), false, null);

CASE3:解析包含基本類型的List或Array生成的OMElement的方法:

 private static List<String> getResults(OMElement element) {
  if(element == null){
   return null;
  }
  Iterator iterator = element.getChildElements();
  List<String> list = new ArrayList<String>();
  while (iterator.hasNext()) {
   OMNode omNode = (OMNode) iterator.next();
   if (omNode.getType() == OMNode.ELEMENT_NODE) {
    OMElement omElement = (OMElement) omNode;
    if (omElement.getLocalName().equals("string")) {
     String temp = omElement.getText().trim();
     System.out.println(temp);
     list.add(temp);
    }
   }
  }
  return list;
 }

CASE4:解析包含自定義Java類型的List或Array的方法:

  private static List<Person> getResults(OMElement element) throws AxisFault {
  if (element == null) {
   return null;
  }
  Iterator iterator = element.getChildElements();
  List<Person> list = new ArrayList<Person>();
  while (iterator.hasNext()) {
   OMNode omNode = (OMNode) iterator.next();
   if (omNode.getType() == OMNode.ELEMENT_NODE) {
    OMElement omElement = (OMElement) omNode;
    if (omElement.getLocalName().toLowerCase().equals("person")) {
     Person person = (Person) BeanUtil.processObject(omElement,
       Person.class, null, true,
       new DefaultObjectSupplier());
     list.add(person);
    }
   }
  }
  return list;
 }

 

 

 

ps:

在現(xiàn)在項(xiàng)目中使用axis2,發(fā)現(xiàn)其源碼有一個(gè)問(wèn)題:

在org.apache.axis2.databinding.utils.BeanUtil.java-500 line
 String partsLocalName = parts.getLocalName();
                PropertyDescriptor prty = (PropertyDescriptor)properties.get(
                        partsLocalName.toLowerCase());
                if (prty != null) {...

可以看到,在第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)一下

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多