使 MTOM 可选

Make MTOM Optional

我正在使用 Tomcat、Apache CXF 和 Spring Boot 公开 SOAP 服务。 Web 服务启用了 MTOM,并且在从 SOAP UI.

对其进行测试时按预期工作

问题是,当我尝试从 SOAP UI 中获取禁用 MTOM 的邮件时,我仍然收到带有 XOP 附件的邮件。我使用的来自 SOAP UI 的选项是: Enable MTOM: false;强制 MTOM: false.

我尝试将请求的接受 header 设置为 application/xml 而不是 application/xop+xml,但我仍然得到同样的结果。

我唯一一次获得 Byte64 流是在我使用小于我设置的阈值的文件进行测试时:

@MTOM(enabled = true, threshold = 2048)

我需要的是 MTOM 在设置为启用时是可选的,并且取决于请求,而不仅仅是阈值,这可能是 SOAP UI 的问题还是我当前的配置忽略请求参数?

我需要这个,因为 Web 服务的某些客户端不支持 MTOM。

这里是object我return来自暴露的方法:

public class Document {

    private DataHandler fileData;

    public DataHandler getFileData() {
        return fileData;
    }

    public void setFileData(DataHandler fileData) {
        this.fileData = fileData;
    }
}

无法从客户端控制您是否希望服务器使用 xop 附件进行响应。

JAX-WS,我认为 none 它的实现,例如 CXF,关心 Accept header,因为它没有在 SOAP 规范中指定服务器必须从请求中读取 if ,也不能在响应中写入哪个值。因此,如果您输入 application/xmltext/xml 或任何其他内容都没有区别。

如果服务器启用了 MTOM,它必须始终(只要它落在阈值范围内)使用 MTOM 发回 soap 响应。

The options from SOAP UI that I use are: Enable MTOM: false; Force MTOM: false

这些是请求消息的选项,因此如果您在请求中发送文件,它将被编码为 base64 附件,这意味着您只是为请求禁用了 MTOM。

这很可惜,但基本上你只有两个选择:

  • 修改服务器并禁用 MTOM 或尝试使用拦截器执行某些操作,例如从请求中读取值,并根据该值以编程方式为该单个消息 enabling/disabling mtom。这就像给自己实现一个机制来决定客户端是否支持 MTOM。

  • 修改不支持 MTOM 的客户端,如果你问这个问题,你可能做不到。