【问题标题】:Spring - Spring-WS with SOAP with attachements or MTOM with JAXB as data binderSpring - 带有带有附件的 SOAP 的 Spring-WS 或带有 JAXB 作为数据绑定器的 MTOM
【发布时间】:2012-06-30 14:14:46
【问题描述】:

我有一个 Spring-WS Web 服务,我希望能够将二进制数据发送回客户端。我的意图是将 SOAP 响应格式化为使用 MTOM 或带有附件的 Soap。响应将是一个 JAXB 对象。

我已经设置了 Spring-WS 环境,可以使用 JAXB 发送和接收请求。然而,我正在努力设置二进制附件响应,因为网络上的大多数教程和信息主要与客户端发送附件有关,而我对服务器将附件发送回客户端感兴趣。

两个问题:

  • 向客户端返回二进制数据的推荐方法是什么?带有附件、MTOM 的 SOAP 还是只是简单地将 base64 编码的数据作为 xml 标记返回?

  • 是否有任何示例说明如何配置 Spring-WS 以使用两种方法中的任何一种返回二进制附件?

【问题讨论】:

标签: java spring soap jaxb spring-ws


【解决方案1】:

1) Mtom 显然是通过soap 发送文件的事实标准,所以我建议这样做。

2) 如果您查看 spring-ws 发行版(不是来自 maven)附带的 mtom 示例,您将看到所需设置的 90%。一个区别是您的附件的预期内容类型,您应该将其设置为 application/octet-stream

现在您在服务器上的代码将如下所示

try {
        dataHandler = new DataHandler(new File("/tmp/test.exe").toURL());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    return new JaxbObjectResponse("id", dataHandler);

您的架构定义看起来像这样。

<xsd:element name="JaxbObjectResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" />
            <xsd:element name="file" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

【讨论】:

  • 是的,我最终在 spring-ws 示例中找到了 MTOM 示例。您是否认为如果我使用 MTOM,客户端也需要启用 MTOM?我确实让它工作了,但我发现的问题是,当我测试服务时,一些客户端(SoapUI)返回正确的响应,而一些客户端(XMLSpy)只是吐出一个错误,说服务返回了一个 NULL 响应。客户是否也必须支持 MTOM 才能让我使用 MTOM?
  • 客户必须了解 mtom 或更具体的 xop。因为 xop 元素将为客户端提供多部分响应映射到该元素的 content-id。 xop 是官方标准,因此所有(良好/适当的)客户都应该能够支持它。 w3.org/TR/xop10
  • 好的,谢谢。我得到了 MTOM 变体可以正常工作。我现在正在尝试 SAAJ(以便能够使用附件),但还没有让它工作。 stackoverflow.com/questions/11430527/…
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2020-08-14
  • 2012-08-05
  • 2014-02-02
  • 2018-12-15
  • 2016-09-28
  • 2014-09-02
  • 2011-06-07
相关资源
最近更新 更多