2011-10-21 6 views
2

JAXWSクライアントをセットアップし、SoapHandler実装をBinding handlerChainに追加しました。これはすべて、これが実行されていないときに生のサービス応答を表示することを希望します。jaxwsハンドラが誤ったレスポンスで動作する

すべてがうまくいけば、handler.handleMessage()は2回呼び出されます.1回はリクエストで、もう一度1回は応答です。

しかし、サービスの応答が何らかの文字化けしたXMLまたはそれより悪い場合、私はhandler.handleFaultが呼び出されることを期待していましたが、何も起こりません。ここで

は、この場合、関連するスタックトレースの一部です:

com.sun.xml.internal.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] 
Message: Premature end of file. 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:256) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:84) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:99) 
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:89) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:164) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:292) 
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:118) 
    com.sun.xml.internal.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:278) 
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:180) 
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83) 
    com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105) 
    com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587) 
    com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546) 
    com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531) 
    com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428) 
    com.sun.xml.internal.ws.client.Stub.process(Stub.java:211) 
    com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124) 
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98) 
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78) 
    com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107) 

私はXMLなると私のハンドラがすでにそのコンテキストでの素敵なXMLを期待して以来いない可能性があります交換だRAWデータを取得したいと思います。 getMessage()。getSOAPPart()これは方法だとは思わない。

IよSOAPスタックをバイパスしてデータを取得するが、これは醜い小さなビット

私は本当にその道を行くべき見つけるためにHTTPを介して直接私の要求を実行しているの誘惑?

答えて

2

AFAIK、JAX-WSサービスの生データストリームをプログラムで取得する方法はありません。

データストリームを取得するには、何らかのハンドラをHTTP(または何でも)プロトコルパイプラインに挿入する必要があります。 JAX-WSの実装とバージョンによってはこれを実現する方法があると確信していますが、JAX-WS標準には含まれていません。

問題をトラブルシューティングするだけで、HTTPパイプラインからの要求と応答をログに記録したい場合は、このシステムプロパティを使用してHTTPトランスポートパイプですべてを記録することができますそれは、それを通って流れ:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true 
も問題を解決するための良い方法です
+0

- それはあなたが持っていない場合、あなたは正確に...あなたのコードが送信された要求を再作成できることを前提としていないにもかかわらずあなたのコードが実際にどこかで生成しているもののログを取得すると、アプリからの不正な入力に起因する問題を再現するのが難しくなります。 –

+0

リモートエンドが正しく動作しているかどうかを簡単に確認できる、いくつかの 'デフォルトクエリ'が存在するため、私の場合はうまくいきます。 – user691154

+0

内部JAX-WS、つまりrt.jarのJREで提供されているJAX-WSを使用する場合は、com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump = trueを使用する必要があります'internal')。[この質問に対する回答](http://stackoverflow.com/questions/5350476/tracing-xml-request-responses-with-jax-ws-when-error-occurs)。 – Hok