最近维护就项目出现个问题,在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);
}
}
}