我使用spring-ws库来处理代码以响应soap请求。我将此代码移动到另一个项目(我正在合并项目),现在它失败了。我想弄清楚失败的原因。
我得到的症状是:当HTTP请求到达时,spring开始处理呼叫。然后我得到以下异常:
org.springframework.ws.soap.saaj.SaajSoapEnvelopeException: Could not access envelope: java.io.IOException: Stream closed; nested exception is javax.xml.soap.SOAPException: java.io.IOException: Stream closed
at org.springframework.ws.soap.saaj.SaajSoapMessage.getEnvelope(SaajSoapMessage.java:109)
<<more lines that don't matter>>
Caused by: java.io.IOException: Stream closed
at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:57)
at java.io.PushbackInputStream.read(PushbackInputStream.java:116)
at org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
... 30 more
在调试器中检查它,看起来spring成功处理HTTP头,但是当它开始处理SOAP消息本身的内容时,它会在读取正文的第一个字符时窒息。一些谷歌搜索错误消息表明,问题是显然用于从套接字读取的PushbackInputStream被读取两次或者可能已调用close(),然后被读取。
它发生在spring-ws中,而不是我的代码中,并且因为它在我将代码移动到新项目之前工作正常,所以它必须与spring的版本或者像轴或xerces一样使用。但我发现这些版本没有任何差异!有没有人遇到此错误?或者您对我可以采取的方法有任何建议吗?
答案 0 :(得分:1)
我的猜测是,在您尝试阅读邮件正文之前,某些内容正在读取流。 这是典型的情况。
如果其他内容正在读取流,则可能会占用整个流并调用flush()和close(),这会导致您的情况。
你有没有在任何一端放一个嗅探器,并观察到肥皂信息实际上包含一个身体?由于流实际上是关闭并抛出空指针或任何东西,因此这不太可能是imo。
答案 1 :(得分:1)
最终解决方案:
事实证明问题根本不在服务器上。相反,我用来发送请求的工具有问题(SoapUI)。非常感谢Knife-Action-Jesus建议我调查它。