Axis2 / Axiom处理SOAP MTOM /非MTOM附件

时间:2010-10-05 13:31:39

标签: java-ee axis2 mtom

环顾四周并尝试不同的建议解决方案后,我正在写这篇文章。建议从MTOM /非MTOM SOAP消息中提取二进制数据的两种最常见的解决方案是:

  1. 检索OMText节点,并使用其中的dataHandler实例
  2. 找到包含'href'属性的OMElement节点。获取'cid:xxxxx'值,并使用'xxxxx'部分从消息上下文实例中的附件映射中检索附件。
  3. 我面临的问题是我的客户端指示SOAP响应消息是MTOM [我使用消息上下文实例的isDoingMTOM()方法确定了这一点]。但是,没有包含'href'属性的OMElement节点。在打印SOAP信封时,我发现二进制数据在主体内部呈现。所以我尝试使用OMText节点方法来获取数据,但每当我尝试将OMElement转换为相应的OMText节点时,我都会遇到classCastException。

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

1 个答案:

答案 0 :(得分:1)

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

以下是来自Axiom网站的链接,其中讨论了toString()的行为: http://ws.apache.org/axiom/userguide/ch05.html#d0e1111

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

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