0

Web サービスとの通信に JAX-WS + SOAP を使用しています。SOAP メッセージ (handleFault) は処理できますが、HTTP Java クライアント層の下で発生するため、HTTP エラーをキャッチする方法がわかりません...

com.sun.xml.ws.client.ClientTransportException: The server sent HTTP status code 412: Precondition Failed
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:203)
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:177)
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:93)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:598)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:557)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:542)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:439)
at com.sun.xml.ws.client.Stub.process(Stub.java:222)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)

サーバーには、エラー状況の説明を含むエンティティを含める必要があることはわかっています(実際、サーバーはまさにそれを行っていると言われています)。

私の質問は次のとおりです。その「エンティティ」に到達するにはどうすればよいですか?

4

1 に答える 1

3

仕様に従って Web サービスが実装されていないようです。SOAP 1.1 に関する W3C Note 08 May 2000 によると(SOAP 1.2 と同じ):

リクエストの処理中に SOAP エラーが発生した場合、SOAP HTTP サーバーは HTTP 500 "Internal Server Error" レスポンスを発行し、SOAP 処理エラーを示す SOAP Fault 要素 (セクション 4.4 を参照) を含む SOAP メッセージをレスポンスに含める必要があります。

「エンティティ」があっても、アプリケーションでそれを処理する必要はないと思います。それは間違いなくハックでしょう。エンティティが何であるかを 1 回だけ知る必要がある場合は、Wireshark などのスニファ ツールを使用してください。

HTTP ステータス コードを本当に無視したい場合は、JAX-WS 実装として CXF に切り替えることができます。そこで、HTTP コードのチェックを無効にすることができます。

org.apache.cxf.endpoint.Client client = ClientProxy.getClient(hw);
client.getRequestContext().put("org.apache.cxf.http.no_io_exceptions", "true");
于 2013-10-22T09:48:49.283 に答える