【问题标题】:Java Spring Web Service Client Fault HandlingJava Spring Web 服务客户端故障处理
【发布时间】:2011-09-24 20:49:44
【问题描述】:

我编写了一个与 UPS Web 服务配合使用的 Web 服务客户端(使用 Java Spring 和 JAXB Marshaller)。当我发送有效请求时,一切正常。当我发送无效请求(重量 > 150 磅)时,UPS 网络服务会以 SOAP 故障响应。客户端应用程序只是失败了

org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling 
exception; nested exception is javax.xml.bind.UnmarshalException: 
unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault").

显然我的程序无法解读 Web 服务返回的 SOAP 错误。我写了一个自定义的 FaultMessageResolver,但它没有被调用。代码如下:

public class UpsRateClient extends WebServiceGatewaySupport {
    public UpsRateClient(WebServiceMessageFactory messageFactory) {
        super(messageFactory);
        getWebServiceTemplate().setFaultMessageResolver(new UpsFaultMessageResolver());
    }

    public RateResponse getRate(RateRequest rateRequest) {
        return (RateResponse) getWebServiceTemplate().marshalSendAndReceive(rateRequest, new UpsRequestWSMC());
    }
    private class UpsFaultMessageResolver implements FaultMessageResolver {
        public void resolveFault(WebServiceMessage message) throws IOException{
            System.out.println("Inside UpsFaultMessageResolver");   
        }
    }
}

感谢您的宝贵时间!

【问题讨论】:

  • 进行wireshark跟踪。我的想法是Web服务可能使用(错误地)HTTP 200OK而不是500 Internal Server错误发送SOAP错误,并且您的客户端尝试将其作为有效响应处理
  • 你是对的!这就是正在发生的事情。那我该如何解决这个问题呢?感谢用户384706的回复!
  • user544192,能否请您指出您的一些代码,或者提供有关如何调用/使用 UPS 网络服务和传递/接收 POJO 的有用链接?我在理解将 POJO 发送到需要调用的 Web 服务的方式时遇到了一些麻烦。您是否将任何 POJO 参数发送到 Web 服务?如果是这样,那么您如何在您的应用程序中制作只有 UPS Web 服务才能理解的 POJO?感谢你的帮助。谢谢。

标签: java web-services spring jaxb spring-ws


【解决方案1】:

我遇到了同样的问题(HTTP 200OK 的 SOAP 错误),我将 CheckConnectionForFault 属性设置为 false 解决了它。 See.

【讨论】:

    【解决方案2】:

    进行 Wireshark 跟踪。我的想法是,Web 服务可能使用(错误地)HTTP 200OK 而不是 500 Internal Server 错误发送 SOAP 错误,并且您的客户端尝试将其作为有效的回应。
    如果是这种情况,那么问题就在于不符合 SOAP 标准的 Web 服务(我的重点):
    来自SOAP RFC

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

    如果您不拥有网络服务,他们应该解决这个问题。
    老实说,我不确定 Spring-WS 的工作范围是什么。
    如果我真的需要 Jax-Ws 中的工作区,我会用 Dispatcher 替换存根调用,以自己处理原始 xml 并避免自动编组/编组。
    如果您可以这样做,请查看 Spring-Ws,但这是 Web 服务的错​​误,而不是您的客户端

    【讨论】:

    • 我说得太早了!我虽然在wireshark 跟踪中看到了200 OK。我再次检查,现在我发现wireshark 没有告诉我HTTP 响应代码,因为只能使用https 访问Web 服务,因此数据包是加密的。这是我在 Wireshark 应用程序数据协议中找到的内容:http 内容类型:应用程序数据 (23) 版本:TLS 1.0 长度:344 加密的应用程序数据:ecb93a7325f8442b032513d7... 抱歉浪费您的时间,user384706!有没有一种简单的方法可以从响应中捕获状态代码?
    • 这是我在日志文件中找到的内容:发送请求 [SaajSoapMessage {ups.com/XMLSchema/XOLTWS/Rate/v1.1}RateRequest] 收到请求 [SaajSoapMessage {ups.com/XMLSchema/XOLTWS/Rate/v1.1}RateRequest] 的响应 [SaajSoapMessage {schemas.xmlsoap.org/soap/envelope}Fault]
    • 感谢 user384706 的宝贵建议!我使用soapUI 来验证http 响应代码和响应soap 信封。我发现 SOAP 错误已返回 HTTP 200 而不是 HTTP 500,就像您所怀疑的那样。你是天才,你猜到了!再次感谢!
    • 事实上我利用了他的回答。因为我确实遇到了这个问题:一个错误和一个 200OK 的答案。将来,如果您想检查标题和正文 inmeadiatle.. 您可以使用 Wireshark 但我宁愿使用soapUI。 ;)
    • OP- 感谢您的热情,但是 Spring-WS 的解决方案是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多