0

我正在使用 JAX-WS + SOAP 与 Web 服务进行通信。我可以处理 SOAP 消息(handleFault),但我不明白如何捕获 HTTP 错误,因为它们发生在 HTTP Java 客户端层下......

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 服务没有按照规范实现。根据W3C Note 08 May 2000 on SOAP 1.1(与 SOAP 1.2 相同):

如果在处理请求时出现 SOAP 错误,SOAP HTTP 服务器必须发出 HTTP 500“内部服务器错误”响应,并在响应中包含 SOAP 消息,其中包含指示 SOAP 处理错误的 SOAP Fault 元素(参见第 4.4 节)。

即使有一些“实体”,我认为你不应该在你的应用程序中处理它。这绝对是一个黑客。如果您只需要一次了解它是什么实体,只需使用一些嗅探器工具,如 Wireshark。

如果您真的想忽略 HTTP 状态代码,您可以切换到 CXF 作为 JAX-WS 实现。在那里你可以禁用检查 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 回答