Как исправить ошибку «Поток закрыт» в spring-ws? - PullRequest
0 голосов
/ 16 июня 2010

У меня есть рабочий код, использующий библиотеку spring-ws для ответа на запросы мыла.Я переместил этот код в другой проект (я объединяю проекты), и теперь он терпит неудачу.Я хотел бы выяснить причину сбоя.

Симптом, который я получаю, заключается в следующем: когда приходит 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 или что-то вроде осей или ксероксов.Но я не могу найти никаких различий в версиях этих!Кто-нибудь сталкивался с этой ошибкой раньше?Или у вас есть какие-либо предложения о способах устранения этой проблемы?

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Окончательное разрешение:

Оказывается, что проблема была НЕ на сервере вообще.Вместо этого было что-то не так с инструментом, который я использовал для отправки запросов (SoapUI).Огромное спасибо Knife-Action-Jesus за то, что он предложил мне изучить его.

1 голос
/ 17 июня 2010

Я предполагаю, что что-то читает поток перед вашей попыткой прочитать текст сообщения. Это типичная ситуация.

Если что-то еще читает поток, он может потреблять весь поток и вызывать flush () и close (), что вызовет ситуацию, в которой вы находитесь.

Вы положили сниффер на оба конца и заметили, что в мыльном сообщении действительно содержится тело? Это менее вероятно, потому что поток фактически закрыт и выбрасывает нулевой указатель или что-то еще.

...