2010-10-05 52 views
2

环顾四周,尝试不同的建议解决方案后,我正在写这个。的2级最常见的解决方案建议从MTOM /非MTOM SOAP消息中提取二进制数据是:Axis2/Axiom处理SOAP MTOM /非MTOM附件

  1. 检索OMText节点,并使用在其内
  2. 存在的DataHandler实例发现包含所述的OMElement节点'href'属性。获取'cid:xxxxx'值,并使用'xxxxx'部分从消息上下文实例中存在的附件映射中检索附件。

我面临的问题是我的客户端指出SOAP响应消息是MTOM [我使用消息上下文实例的isDoingMTOM()方法确定了这一点]。但是,没有包含'href'属性的OMElement节点。在打印SOAP信封时,我发现二进制数据在主体内部呈现。所以我尝试了OMText节点方法来获取数据,但每当我尝试将OMElement转换为相应的OMText节点时,我都会收到一个classCastException。

有人能指出我错过了什么吗?

回答

1

如何打印出SOAPEnvelope Axiom对象?如果你正在调用toString()方法,这有一些不幸的副作用。具体来说,toString()方法将导致Axiom解析底层的SOAP消息,并构建代表原始XML的Axiom Object图(OMElement节点等)。作为对象图正在修建,公理会改变轻微的XML的表示:

下面是Axiom的网站的链接,讲述的toString的)行为(: http://ws.apache.org/axiom/userguide/ch05.html#d0e1111

特别是对于MTOM的消息,因为Axiom正在构建对象图,它将用原始二进制文件的Base64编码文本表示替换指向原始二进制MTOM附件的元素 - 有效地消除了使用MTOM的任何好处(MTOM允许您放弃Base64编码过程这扩大了二进制的大小)。如果您查看调试器中的Axiom Object图,也会发生元素的替换(因为这样也会调用toString()方法)。

您是否使用ADB作为XML绑定框架?