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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:34:51