You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot WebService:能否移除MessageContext实例中的所有附件?

在Spring Boot WebService拦截器中删除所有请求附件的解决方案

你之前的代码报错是因为SaajSoapMessage.getAttachments()返回的是只读迭代器,不支持remove()操作。要删除所有附件,得直接操作底层的SAAJ SOAPMessage对象,它提供的附件迭代器支持修改操作。

直接用下面的代码替换你的逻辑即可:

public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
    WebServiceMessage requestReceived = messageContext.getRequest();
    if (requestReceived instanceof SaajSoapMessage) {
        SaajSoapMessage saajMessage = (SaajSoapMessage) requestReceived;
        SOAPMessage soapMessage = saajMessage.getSaajMessage();
        
        Iterator<MimePart> attachments = soapMessage.getAttachments();
        // 遍历并逐个移除附件
        while (attachments.hasNext()) {
            attachments.next(); // 先移动到下一个元素
            attachments.remove(); // 移除当前元素
        }
        
        // 将修改后的SOAPMessage回写到SaajSoapMessage中
        saajMessage.setSaajMessage(soapMessage);
    }
    return true;
}

关键说明:

  • 直接操作SOAPMessage的附件迭代器:JAX-WS的SAAJ实现中,SOAPMessage.getAttachments()返回的迭代器是可修改的,支持remove()方法。
  • 迭代器使用规范:必须先调用next()获取元素,再调用remove(),否则会抛出IllegalStateException。
  • 回写修改:修改完SOAPMessage后,需要调用saajMessage.setSaajMessage(soapMessage)确保修改生效,让后续的WebService逻辑使用无附件的请求。

内容的提问来源于stack exchange,提问作者Juan Solo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:25:49