【问题标题】:JAX-WS + SOAP: How to parse HTTP Client ErrorJAX-WS + SOAP:如何解析 HTTP 客户端错误
【发布时间】:2013-10-21 20:39:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: java parsing http soap jax-ws


    【解决方案1】:

    看起来 web 服务没有按照规范实现。根据W3C Note 08 May 2000 on SOAP 1.1(与 SOAP 1.2 相同):

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

    即使有一些“实体”,我认为您也不应该在应用程序中处理它。这绝对是一个黑客。如果您只需要了解一次它是什么实体,只需使用一些嗅探器工具,例如 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");
    

    【讨论】:

    • 让我们看看... HTTP 500 仍然是一个 HTTP 错误!我怎样才能到达返回的 XML? java实现有限制吗?有人告诉我,SecureBlackbox 库有一个对象,该对象具有一个名为 ServerStatusCode 的属性,其中包含一个名为 responseFromServer 的后响应 XML 对象,可以对其进行解析以获取错误情况。
    • @marcolopes 服务器应返回 HTTP 500 和 SOAP 错误作为 XML 内容,如 here 所示。如果在 WSDL 中指定了这个错误,那么它将被转换为适当的 Java 异常。关于 SecureBlackbox - 你的意思是像 this device 这样的东西。看起来这个设备提供的服务不是 SOAP 之一。它看起来像 Rest/XML。此外,我找不到任何对 SecureBlackbox 支持 SOAP over HTTP 的参考。
    • 那么,即使返回正确的 HTTP 错误 500,服务仍然需要在 WSDL 规范中包含可能的错误,否则 java(和其他语言??)永远不会抛出有用的异常?
    • 原来在 CXF 中你可以禁用检查 HTTP 代码。也许它允许您接收有效负载(请参阅我编辑的答案)。但一般来说,HTTP 代码 200 和 500 仅适用于 SOAP over HTTP。是的,应该在 WSDL 中指定可能的错误(soap 错误)。
    猜你喜欢
    • 2015-04-06
    • 2011-03-04
    • 1970-01-01
    • 2012-04-16
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多