AXIS2中OMElement和Java对象之间的转换

AXIS2中OMElement和Java对象之间的转换

 

AXIOM java

AXIs 对象模型 (AXIOM) 是一个 XML 对象模型,设计用于提升 XML 处理期间的内存使用率和性能,基于 Pull 解析。经过使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也称为 OM)能够控制解析过程,以提供延迟构建支持。延迟构建是指 AXIOM 不彻底构建对象模型,模型的其他部分基于用户的需求构建。如下示例对此概念进行了说明: 数组

假定某个用户须要从 XML 输入流中得到第一我的的 <Location> 元素值,AXIOM 构建的对象模型将一直包含到 <Location> 元素结束的内容,而让其余内容保留在流中: app


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

这里的优点在于,尽量仅使用能知足用户的需求的内存。若是用户但愿访问较大的文档中前面的数个字节或数千字节,则延迟构建功能将改善该应用程序的内存需求状况。 优化

能够从任何元素得到 StAX 事件,而无论是否完整构建了对象模型。在有些状况下,Axis 2 中的此功能很是有用。例如,当 Axis2 做为中介传递时,若是须要仅读取 SOAP 消息的 Header,AXIOM 将防止其读取整个 SOAP 消息,使其具备很高的内存效率。另外一个例子是,当 Web 服务实现可以直接使用 StAX 事件时,因为采用了 AXIOM,Web 服务所需的内存很是小。 ui

此外,AXIOM 内置了消息传输优化机制(Message Transfer Optimization Mechanism,MTOM)支持。对于 AXIOM 体系结构,能够经过实现 AXIOM 接口并将其插入到 Axis2 中来执行本身的对象模型。 this

因为 AXIOM 最初是做为 Axis2 的对象模型而开发的,所以 AXIOM 提供了构建于基础 AXIOM API 之上的 SOAP 接口。这容许您使用 envelope.getHeaders  envelope.getBody 之类的便利方法查看 SOAP。 spa

AXIS2会将Web Service方法中的参数或返回值中的自定义对象、数组、List等类型统一映射为OMElement类型,这就咱们须要编写OMElement与自定义类型质检的转换方法,下面给出几个经常使用的方法: 设计

CASE1:自定义对象生成OMElement方法: code

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

相关文章
相关标签/搜索