使用 JAX-WS 和 MTOM/XOP 重写“Content-Type”标头和 MIME 边界

Posted

技术标签:

【中文标题】使用 JAX-WS 和 MTOM/XOP 重写“Content-Type”标头和 MIME 边界【英文标题】:Rewriting "Content-Type" header and MIME boundaries with JAX-WS and MTOM/XOP 【发布时间】:2015-09-26 02:34:41 【问题描述】:

我有一个需要遵守的规范,这在使用 MTOM/XOP 提供和使用 Web 服务时提出了一些相当不寻常的要求(由于历史原因):

总而言之,Content-Type HTTP Header 必须这样编码: start-info 和 action 必须编码为 Content-Type 的单独参数: start-info="application/soap+xml";action="urn:ihe:iti:2007:RetrieveDocumentSet"

与此相反,MTOM/XOP 规范要求:

Content-Type: multipart/related;start="...";type="application/xop+xml";boundary="...";start-info="application/soap+xml;action=\"urn:ihe:iti:2007:RetrieveDocumentSet\""

因此“action”包含在“start-info”参数中并进行了转义。 我们正在使用 JAX-WS 来提供和使用 Web 服务,我看不到更改标头和 MIME 边界以满足规范要求的有效解决方案。

这同样适用于随 Web 服务消息发送的 MIME 边界。

Java7 和 Java8 包含的 JAX-WS 实现似乎对此处理方式不同,即:Java7 按照我需要遵守的规范进行编码,而 Java8 根据 MTOM/XOP 规范进行编码。我无法返回 Java8,因为我正在使用的其他库需要 Java8

有没有办法修改 JAX-WS 的行为,或者在到达其他系统之前拦截和更改标头/MIME 边界?

【问题讨论】:

【参考方案1】:

同时,我们找到了答案:可以在应用程序中使用自定义TubeFactory。然后,这可以返回一个标准的 HttpTransportPipe 和一个修改后的 Codec 实现,它修改了 getStaticContentType(Packet) 方法中的 Content-Type 标头。

【讨论】:

以上是关于使用 JAX-WS 和 MTOM/XOP 重写“Content-Type”标头和 MIME 边界的主要内容,如果未能解决你的问题,请参考以下文章

发生错误时使用 JAX-WS 跟踪 XML 请求/响应

如何使用JAX-WS 2.0模拟soap响应?

真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService

在 JAX-WS 中重命名参数名称

使用wsimport和JAX-WS调用Web Service接口

为 JAX-RPC Web 服务生成 JAX-WS 客户端存根?