0

私は、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が2回読み取られるか、close()が呼び出され、後で読み取られることが問題であることがわかります。

これは私のコードではなくspring-wsの内部で発生しており、コードを新しいプロジェクトに移動する前は正常に機能していたため、Springのバージョン、またはaxisやxercesなどの何かに関係している必要があります。しかし、私はこれらのバージョンの違いを見つけることができません!誰かが以前にこのエラーに遭遇したことがありますか?または、これをトラブルシューティングする際に私が取ることができるアプローチの提案がありますか?

4

2 に答える 2

1

最終的な解決策:

問題はサーバーにはまったくありませんでした。代わりに、リクエストの送信に使用していたツール(SoapUI)に問題がありました。私がそれを調べることを提案してくれたKnife-Action-Jesusに感謝します。

于 2010-06-17T14:29:09.880 に答える
1

私の推測では、メッセージの本文を読み込もうとする前に、何かがストリームを読み取っていると思います。これが典型的な状況です。

他の何かがストリームを読み取っている場合は、ストリーム全体を消費し、flush()とclose()を呼び出している可能性があります。これにより、状況が発生します。

どちらかの端にスニファを配置し、石鹸メッセージに実際に本文が含まれていることを確認しましたか?ストリームが実際に閉じられ、nullポインターなどがスローされるため、これはimoの可能性が低くなります。

于 2010-06-16T20:19:59.440 に答える