1

我完全被困住了,需要你的帮助......我已经为在肥皂消息中发送二进制文件(base64 编码的 jpg 图像)的服务创建了一个带有 jaxb 2.x 的 web 服务存根。一切正常,我能够接收和显示图像,直到我尝试将 eclipse RCP 应用程序导出到产品,这立即导致 LinkageErrors(像往常一样,javax.xml.namespace.QName 等等)。

我能够解决该问题以“重新捆绑”axis2,现在一切正常 - 除了解析存根中的二进制文件部分,现在导致异常(意外元素)。

仔细观察发现,axis2-jaxb 生成的存根中使用的读取器 (OMStAXWrapper) 现在不会读取整个 base64 文本,而只会读取前 10000 个字节。然后它没有找到元素的正确结尾并抛出异常。

如前所述 - 这在开始时并没有发生,所以我希望它只是一个参数或一个选项。非常感谢您的每一个帮助或提示!

编辑 这不是 JAXB,我使用 JAXWS 和 wsimport 为 wsdl 文件创建存根......

4

1 回答 1

1

作为背景知识,OMStAXWrapper 是 Axiom 的一部分,Axiom 是 Axis2 用于 Web 服务的自定义流实用程序,Axis2 使用它来替代 SAAJ。如果它有问题,我不会感到非常惊讶,如果我之前在 Axis 上的经验是可以参考的。

如果您想通过 SOAP 发送大型二进制文件,目前最好的技术似乎是 MTOM(请参阅此处了解如何将它与 Axis2 一起使用)。这可以更好地优化二进制表示,并且您的问题可能会消失。但是,客户端和服务器都必须能够说 MTOM,因此它可能不适合您。

或者,应该可以说服 Axis2 使用标准 SAAJ API 而不是使用 Axiom。SAAJ 速度较慢,但​​错误应该更少。

我的最终建议是为您的客户放弃 Axis2,并使用更轻量级的东西。Spring-WS提供了一个非常好的客户端 API,这是我目前与远程 Web 服务对话的首选工具。它支持 Axiom 和 SAAJ 以及 MTOM,而且它足够轻巧,很容易找出出现问题的原因。

于 2009-07-09T18:26:23.000 回答