`

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

阅读更多

 

近在使用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>

这里的优势在于,尽可能仅使用能满足用户的需求的内存。如果用户希望访问较大的文档中前面的数个字节或数千字节,则延迟构建功能将改善该应用程序的内存需求情况。

可以从任何元素获得 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.getHeaders  envelope.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;
 }

 

 

 

ps:

在现在项目中使用axis2,发现其源码有一个问题:

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

可以看到,在第500行进行了一个toLowerCase()转换,导致自定义类型的转换出现bean属性丢失,

将它去掉,重新打包就可以正常运行了;

不明白为什么axis2工作小组要进行这样处理呢;

不知道这算不算一个bug,总不能就规定我们只能使用全部小写字母来定义bean属性吧,有违java编码规范啊;

看来要给apache反应一下

分享到:
评论

相关推荐

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

    AXIS2 中 OMElement 和 Java 对象之间的转换 AXIS2 是一个流行的开源 Web 服务框架,它提供了一个强大的对象模型,称为 AXIOM(AXIs 对象模型),用于提高 XML 处理期间的内存使用率和性能。AXIOM 通过使用 ...

    Axis2的OMElement SOAP XML报文节点首字母小写转大写(注意,是节点,不是节点元素的值) java

    Axis2中的OMElement是用于表示XML元素的类,它是Apache Axis2对象模型(Object Model)的一部分。OMElement提供了丰富的API,用于操作和构建XML文档。要实现节点首字母小写转大写的转换,我们需要遍历整个SOAP XML...

    axis2客户端编码,RPC,OMElement,上传下载实现,服务端验证

    “OMElement”是Apache Axis2中的一个核心概念,它是对象模型(Object Model)层次结构的基础元素。OMElement可以表示XML文档的任何部分,如元素、属性或者文本节点。在处理SOAP消息时,我们经常使用OMElement来构建...

    Web Services & Axis2.zip(2011年度巨献)

    7. **OMElement和java对象之间的转换.doc** - Axis2使用OM(Object Model)元素来处理XML,这份文档可能解释了如何在Java对象和OMElement之间进行转换,这对于处理XML数据至关重要。 8. **Java.Web服务开发(必学)...

    WebServiceDemo-Axis2

    在Axis2中,RPC风格的服务使得Java方法可以直接暴露为Web服务操作。在这个示例中,我们看到RPC方式被用来处理数据类型,这使得服务端的方法调用更加直观和简单。 接下来,我们讨论OM(对象模型)元素。AXI2中的...

    通向架构师的道路(第十天)之Axis2 Web Service(一).docx

    Axis2 是一个基于 JAVA 语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group)的开放源代码实现。Axis2 框架来自 Apache 开放源代码组织,具有灵活的消息传递框架、传输框架、数据...

    通向架构师的道路(第十二天)之Axis2 Web Service(三).docx

    在Axis2中,可以通过抛出特定类型的异常,让Axis2自动转换成SOAPFault。 3. **使用SWA(Soap With Attachment)** SWA允许在SOAP消息中附加非XML数据,如图像或文件。在Axis2中,可以利用MTOM(Message ...

    SOAP的Client调用Axis服务

    OMElement是Apache Axis2中的一个关键类,用于构建和操作XML文档,它是构建SOAP消息的基础。至于上传下载实现,这可能涉及到文件传输的场景,客户端可能需要将文件数据转换为SOAP消息的一部分,服务端则负责接收和...

    axiom api

    当收到SOAP请求时,Axis2会使用Axiom解析XML消息,然后将其转换为Java对象进行业务逻辑处理。反之,当需要发送响应时,Axiom会将Java对象转化为SOAP消息。 在标签"axis2 axis"中,我们可以看到Axiom API是Axis2的...

    axiom-api-1.2.1.jar.zip

    在"axiom-api-1.2.1.jar"中,包含了一系列类和接口,它们提供了XML对象的创建、操作和序列化的方法。这些API允许开发者在Java应用程序中轻松处理XML文档,进行解析、修改、查询和生成。例如,Axiom提供了OMElement...

    axiom-dom-1.2.8.jar.zip

    2. **基本操作**:Axiom DOM提供了一系列的类和接口,如OMDocument、OMElement等,用于创建、读取和修改XML文档。例如,创建一个新的XML文档: ```java import org.apache.axiom.dom.DOMImplementationOMFactory; ...

Global site tag (gtag.js) - Google Analytics