我有使用spring-ws庫來響應soap請求的工作代碼。我將這段代碼移到了不同的項目中(我正在合併項目),現在它失敗了。我想找出失敗的原因。如何修復spring-ws中的「Stream closed」錯誤?
我得到的症狀是:當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
在調試器中檢查它,似乎春天成功處理HTTP頭,但是當它開始處理SOAP消息本身的內容,它讀取非常時扼流圈身體的第一個字符。一些谷歌搜索錯誤消息表明,問題是顯然用於讀取套接字的PushbackInputStream被讀取兩次,或者可能調用close(),然後被讀取。
它發生在spring-ws裏面,不是我的代碼,而且因爲它在我將代碼移動到一個新項目之前工作得很好,所以它必須與spring的版本或者像axis或xerces一樣使用的東西。但是我無法在這些版本中找到任何區別!有沒有人遇到過這個錯誤?或者你有什麼方法可以解決這個問題?
我同意有些東西可能是事先閱讀的,它必須是Spring-ws的一部分:無論是spring本身,還是xalan或saaj ......其中之一。感謝關於檢查身體是否爲空的建議:我懷疑它(因爲我沒有改變關於客戶端的任何事情),但它很容易檢查,因此值得去做。 – mcherm 2010-06-17 11:52:23