首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Spring的WebServiceTemplate.marshalSendAndReceive处理故障响应

从Spring的WebServiceTemplate.marshalSendAndReceive处理故障响应
EN

Stack Overflow用户
提问于 2014-01-22 17:01:48
回答 1查看 8.9K关注 0票数 4

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

代码语言:javascript
复制
<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消息。

代码语言:javascript
复制
   <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和堆栈跟踪有用得多。

使用搜索和替换修改了包、类名和对象名,以提取个人数据。如果包或类名看起来很奇怪,这就是为什么.

EN

回答 1

Stack Overflow用户

发布于 2018-12-16 12:16:11

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21289251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档