SOAP namespace(命名空间) 错误生成到 body 里的解决方案

本文介绍了一个关于SOAP消息中namespace出现在<Body>标签内的问题,并提供了两种解决方案:一种是通过添加特定的JAR文件来解决,另一种是通过代码方式重新分配namespace。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近维护就项目出现个问题,在server上生成的  SOAP 的 namespace 生成到了 <Body> 里面, 如下

<S:Body xmlns:ns1="http://www.test.com/header/v1" xmlns:ns2="http://www.test.com/data/common/v1" xmlns:ns3="http://www.test.com/data/bookings/v1">
        <ns1:PayByCreditCard>
            <ns1:Amount>100</ns1:Amount>
        </ns1:PayByCreditCard>
</S:Body>


而本地却没有这个问题,xml如下:

<S:Body>
        <ns1:PayByCreditCardxmlns:ns1="http://www.test.com/data/bookings/v1" xmlns:ns2="http://www.test.com/data/common/v1" xmlns:ns3="http://www.test.com/header/v1">
            <ns1:Amount>100</ns1:Amount>
        </ns1:PayByCreditCard>
    </S:Body>


1. 试试加上这个这个 jar

<dependency>
         <groupId>com.sun.xml.ws</groupId>
          <artifactId>jaxws-rt</artifactId>
          <version>2.2.6-6</version>
 </dependency>


2. 代码解决

SOAPMessage message = context.getMessage();

 SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope();

SOAPBody body = envelope.getBody();

if(body.hasAttributes() &&
                        (body.hasAttribute("xmlns") || body.hasAttribute("xmlns:ns1") ||
                                body.hasAttribute("xmlns:ns2") || body.hasAttribute("xmlns:ns3"))){
                    
                    Iterator<SOAPElement> elements = body.getChildElements();
                    while(elements.hasNext()){
                        SOAPElement el = elements.next();
                        List<String> prefixList = IteratorUtils.toList(body.getNamespacePrefixes());
                        
                        for(String prefix : prefixList){
                            el.addNamespaceDeclaration(prefix, body.getNamespaceURI(prefix));
                            body.removeNamespaceDeclaration(prefix);
                        }
                    }
                }

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值