从Java8迁移至Java17,如何移除SOAP响应的指定命名空间与空Header
解决Java17下SOAP响应冗余命名空间与空Header节点问题
问题背景
从Java8迁移至Java17,使用jakarta.xml.ws:jakarta.xml.ws-api:4.0.0依赖,基于WSDL开发。请求格式与Java8时期一致,但Java17返回的SOAP响应额外包含xmlns:SOAP-ENV命名空间声明,以及空的<SOAP-ENV:Header>节点,需要移除这两个冗余内容,恢复到Java8时期的响应格式。
当前响应冗余内容:
<?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header></SOAP-ENV:Header> <S:Body> //has data here </S:Body> </S:Envelope>
期望响应格式:
<?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> // has data here </S:Body> </S:Envelope>
解决方案
通过已实现的SoapMsgHandler(实现SOAPHandler<SOAPMessageContext>),在出站消息处理阶段操作SOAP消息的DOM结构,完成以下两个操作:
- 移除空的
<SOAP-ENV:Header>节点 - 删除Envelope上冗余的
xmlns:SOAP-ENV命名空间声明
代码实现
修改SoapMsgHandler的handleMessage方法,添加响应处理逻辑:
import jakarta.xml.soap.*; import jakarta.xml.ws.handler.MessageContext; import jakarta.xml.ws.handler.soap.SOAPHandler; import jakarta.xml.ws.handler.soap.SOAPMessageContext; import java.util.Set; public class SoapMsgHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { // 判断是否为出站响应消息 Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isOutbound) { try { SOAPMessage soapMsg = context.getMessage(); SOAPEnvelope envelope = soapMsg.getSOAPPart().getEnvelope(); // 移除空的Header节点 SOAPHeader header = envelope.getHeader(); if (header != null && header.getChildNodes().getLength() == 0) { envelope.removeChild(header); } // 移除冗余的SOAP-ENV命名空间声明 envelope.removeNamespaceDeclaration("SOAP-ENV"); // 保存修改后的消息 soapMsg.saveChanges(); context.setMessage(soapMsg); } catch (SOAPException e) { // 根据业务需求处理异常 e.printStackTrace(); } } return true; } @Override public boolean handleFault(SOAPMessageContext context) { return true; } @Override public void close(MessageContext context) { // 资源清理逻辑(如果需要) } @Override public Set<QName> getHeaders() { return Set.of(); } }
配置说明
已有的handler-chain.xml配置无需修改,确保处理器被正确加载:
<handler-chains xmlns="https://jakarta.ee/xml/ns/jakartaee"> <handler-chain> <handler> <handler-class>com.xyz.SoapMsgHandler</handler-class> </handler> </handler-chain> </handler-chains>
验证
部署修改后的代码后,SOAP响应将不再包含冗余的xmlns:SOAP-ENV命名空间和空Header节点,与Java8时期的响应格式一致。
内容的提问来源于stack exchange,提问作者user3778690
相关产品推荐
相关产品推荐

