AXIS2中OMElement和Java對象之間的轉換

來源:互聯網
上載者:User
 

最近在使用AXIS2部署Web Service,關於如果使用axis2部署Web Service的方法不想在這裡多說,網站有很多相關的文章,這裡只想談談AXIOM對象與Java中的對象的轉換方法。

關於AXIOM的介紹,下面這個片段已經說得很明白了:

AXIOM

AXIs 物件模型 (AXIOM) 是一個 XML 物件模型,設計用於提高 XML 處理期間的記憶體使用量率和效能,基於 Pull 解析。通過使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱為 OM)可以控制解析過程,以提供延遲構建支援。延遲構建是指 AXIOM 不完全構建物件模型,模型的其餘部分基於使用者的需求構建。以下樣本對此概念進行了說明:

假定某個使用者需要從 XML 輸入資料流中獲得第一個人的 <Location> 元素值,AXIOM 構建的物件模型將一直包含到 <Location> 元素結束的內容,而讓其他內容保留在流中:

清單 1. 物件模型的 AXIOM 部分構建

<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>

這裡的優勢在於,儘可能僅使用能滿足使用者的需求的記憶體。如果使用者希望訪問較大的文檔中前面的數個位元組或數KB,則延遲構建功能將改善該應用程式的記憶體需求情況。

可以從任何元素獲得 StAX 事件,而不管是否完整構建了物件模型。在有些情況下,Axis 2 中的此功能非常有用。例如,當 Axis2 作為中介傳遞時,如果需要僅讀取 SOAP 訊息的 Header,AXIOM 將防止其讀取整個 SOAP 訊息,使其具有很高的記憶體效率。另一個例子是,當 Web 服務實現能夠直接使用 StAX 事件時,由於採用了 AXIOM,Web 服務所需的記憶體非常小。

此外,AXIOM 內建了訊息傳輸最佳化機制(Message Transfer Optimization Mechanism,MTOM)支援。對於 AXIOM 體繫結構,可以通過實現 AXIOM 介面並將其插入到 Axis2 中來執行自己的物件模型。

由於 AXIOM 最初是作為 Axis2 的物件模型而開發的,因此 AXIOM 提供了構建於基礎 AXIOM API 之上的 SOAP 介面。這允許您使用 envelope.getHeadersenvelope.getBody 之類的便利方法查看 SOAP。

AXIS2會將Web Service方法中的參數或傳回值中的自訂對象、數組、List等類型統一映射為OMElement類型,這就我們需要編寫OMElement與自訂類型質檢的轉換方法,下面給出幾個常用的方法:

CASE1:自訂對象產生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;
 }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.