我有一个需要克隆的SOAPMessage,因为我想将其用作其他SOAPMessage实例的基础。这是SOAPMessage的结构:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<QueryRequest xmlns="somenamespace">
<QueryList day="2018-08-30" />
</QueryRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我读到here,克隆SOAPMessage的方式如下:
SOAPMessage soapMessage = .....
ByteArrayOutputStream stream = new ByteArrayOutputStream();
soapMessage.writeTo(stream);
String message = new String(stream.toByteArray(), "utf-8");
InputStream inputStream = new
ByteArrayInputStream(message.getBytes());
SOAPMessage clonedMsg = MessageFactory.newInstance().createMessage(null, inputStream);
这几乎可行,但是结果是:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<QueryRequest>
<QueryList day="2018-08-30" xmlns="somenamespace"/>
</QueryRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
因此,基本上,它似乎已经更改了名称空间声明的位置。从理论上讲,我知道这没什么大不了,但是由于这个原因,我正在调用的服务器拒绝SOAP消息,因此我无法更改。问题出在.writeTo()方法之内,因为String已经在错误的节点上包含名称空间声明。
有没有办法使消息与以前完全相同?
谢谢。