2

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

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

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

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

4

1 回答 1

2

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

这是 Axiom 网站上的一个链接,其中讨论了 toString() 的行为: http ://ws.apache.org/axiom/userguide/ch05.html#d0e1111

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

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

于 2010-12-13T15:21:17.357 回答