JAX-WS + SOAP:如何解析HTTP客户端错误

时间:2013-10-21 20:39:43

标签: java parsing http soap jax-ws

我正在使用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)

我知道服务器应该包含一个包含错误情况解释的实体(事实上,我已经被告知它正在这样做)。

我的问题是:如何到达那个“实体”?

1 个答案:

答案 0 :(得分:2)

看起来Web服务没有按照规范实现。根据{{​​3}}(与SOAP 1.2相同):

  

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

即使有一些“实体”,我认为你不应该在你的申请中处理它。这肯定是一个黑客。如果您只需要了解一次实体是什么,只需使用一些狡猾的工具,如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");