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
相关产品推荐
相关产品推荐

