我正在创建一个 SOAPMessage 以通过 web 服务返回给客户端。在我的本地化测试(使用 TCPMon)期间,我将此 SOAPMessage 视为响应,但它会故障转移 Web 服务。
我使用 Wireshark 进行了一些诊断,发现此响应 xml(SOAPMessage) 已损坏,因为它在第 1024 个字符处添加了换行符。我不知道响应是否正确形成,并且由于某种原因,Wireshark 添加了换行符,或者此响应被真正损坏。我正在使用 Tomcat
要了解代码的结构,它类似于 -
在流程中的某个时刻,我设置了以下内容(我删除了这两行,但结果仍然相同)
//httpservletResponse.setContentType("text/html; charset=UTF-8");
//httpservletResponse.setCharacterEncoding("UTF-8");
在流程的后期,我执行以下操作
try {
servletOS = httpservletResponse.getOutputStream();
soapMessage.writeTo(servletOS);
servletOS.close();
} finally {
httpservletResponse.flushBuffer();
}
上面的代码只是给出一个基本的理解,请考虑它编译良好并且所有用户定义的值都正确设置。我正在努力缩小确切问题的可能范围,实际上是 SOAPMessage 由于其编码等原因?流被刷新/关闭等?客户?
我很乐意提供更多信息。
另请注意,使用 SAAJ 的类似过程在相同环境中工作得非常好。
这就是我建立回应的方式 -
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart responseSOAPPart = faultMessage.getSOAPPart();
SOAPEnvelope responseEnvelope = responseSOAPPart.getEnvelope();
soapMessage.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");
soapMessage.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
responseEnvelope.addNamespaceDeclaration("xsd", "http://........");
responseEnvelope.addNamespaceDeclaration("wsa", "http://......");
// and others
SOAPHeader soapHeader = responseEnvelope.getHeader();
// creating various SOAPHeaderElements viz. wsa:To, wsa:Action, wsa:From etc.
// and adding these to the SOAPHeader
// Adding SOAPBody
SOAPBody body = soapMessage.getSOAPBody();
// add body element
soapMessage.saveChanges()