使MTOM可选

时间:2016-02-23 14:41:43

标签: web-services tomcat soap jax-ws mtom

我使用Tomcat,Apache CXF和Spring Boot公开SOAP服务。 Web服务已启用MTOM,并且在从SOAP UI进行测试时可以正常工作。

问题在于,当我尝试从SOAP UI中禁用MTOM时,我仍然收到带有XOP附件的消息。我使用的SOAP UI中的选项是:启用MTOM:false;强制MTOM:false。

我试图将请求的Accept标头设置为application / xml而不是application / xop + xml,但我仍然得到同样的东西。

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

@MTOM(enabled = true, threshold = 2048)

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

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

这是我从公开方法返回的对象:

public class Document {

    private DataHandler fileData;

    public DataHandler getFileData() {
        return fileData;
    }

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

1 个答案:

答案 0 :(得分:0)

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

JAX-WS,我认为它的所有实现(例如CXF)都不关心Accept标头,因为它没有在SOAP规范中指定服务器必须从请求,也不应该在响应中写入哪个值。因此,如果您放置application/xmltext/xml或其他任何内容,则无效。

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

  

我使用的SOAP UI中的选项是:启用MTOM:false;强制MTOM:false

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

这真是令人失望,但基本上你只剩下两个选择:

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

  • 修改不支持MTOM的客户端,如果您提出此问题,可能无法做到。