【问题标题】:Handling Fault Responses from Spring's WebServiceTemplate.marshalSendAndReceive处理来自 Spring 的 WebServiceTemplate.marshalSendAndReceive 的故障响应
【发布时间】:2014-02-12 21:13:08
【问题描述】:

我正在使用 Spring 的 WebServiceTemplate.marshalSendAndReceive(Object, WebServiceMessageCallback) 方法,但我很难理解如何正确处理错误。现在我正在调用一个 SOAP 服务,如果有人使用相同的唯一标识符,如果内部发生错误,该服务将响应以下消息。

<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Fault>
        <faultcode>BEA-380001</faultcode>
        <faultstring>Internal Server Error</faultstring>
        <detail>
            <ns0:Fault xmlns:ns0="http://www.package.com/CommonEntities/V2" xmlns:ns2="http://www.package.com/package/schema">
                <ns0:FaultDateTime>2014-01-22T10:39:56.056-06:00</ns0:FaultDateTime>
                <ns0:FaultMessage>An application already exists for ID [987654321].</ns0:FaultMessage>
                <ns0:FaultCode>500</ns0:FaultCode>
                <ns0:FaultStack>com.package.package.exceptions.MyException: An application already exists for ID [987654321].
        at com.package.package.endpoints.MyEndpoint.createObject(MyEndpoint.java:71)
        at com.package.package.endpoints.MyEndpoint$$FastClassByCGLIB$$b46dae63.invoke(&lt;generated&gt;)
        at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
        ...More of this stack trace...

但是,只有将 org.springframework 日志记录设置为 trace 才能找到此消息。实际上使它退出我对marshalSendAndReceive 的调用的消息是以下更通用的SoapFaultClientException 消息。

   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xml:lang="en">Internal Server Error</faultstring>
         <detail>
            <ns2:Fault xmlns:ns2="http://www.package.com/package/schema" xmlns:ns3="http://www.package.com/package/schema/update">
               <ns2:FaultDateTime>2014-01-22T10:39:56.787-06:00</ns2:FaultDateTime>
               <ns2:FaultMessage>Internal Server Error</ns2:FaultMessage>
               <ns2:FaultCode>2</ns2:FaultCode>
               <ns2:FaultStack>org.springframework.ws.soap.client.SoapFaultClientException: Internal Server Error
    at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:37)
    at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:776)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:602)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:539)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:386)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:380)
    at com.package.package.package.adapters.MyAdapter.submitObject(MyAdapter.java:48)

如何从原始响应中获取 Body\Fault\details\Fault\FaultMessage 并将其作为异常抛出到我的适配器中??

来自后端请求的实际错误消息将比一般的 SoapFaultClientException 和堆栈跟踪有用得多。

使用搜索和替换来修改包、类和对象名称以提取个人数据。如果包或类名看起来很奇怪,那就是原因。

【问题讨论】:

  • 嗨凯尔,你能找到答案吗?
  • @Vikky 我的一位同事最终编写了一些循环遍历对象并挖掘到我认为的实际错误的逻辑。当我被拉到其他更紧迫的事情上并且其他人接手时,我忘记了这个问题。今晚我将深入研究代码并尝试找到解决方案。
  • 谢谢,我可以研究一下我们需要捕获 SoapFaultClientException。由于 Spring 每当在 respoint 中看到 Faultcode 和 FaultString 时都会抛出此异常,并在异常本身中包含响应的详细信息。就像我们可以使用 {ex.getSoapFault().getFaultStringOrReason(); 找到故障原因并获取更多详细信息,您可以像 e.getSoapFault().getFaultDetail().getDetailEntries(); 一样浏览 但我仍然无法了解收到的响应的所有详细信息。

标签: java spring soapfault webservicetemplate


【解决方案1】:

您可以实现CclientInterceptor 类,该类允许自定义客户端消息拦截。

查看本教程: https://codenotfound.com/spring-ws-log-client-server-http-headers.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多