Обработка ответов на ошибки от Spring WebServiceTemplate.marshalSendAndReceive

Я работаю с весны 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 и трассировка стека.

Имена пакетов, классов и объектов были изменены с помощью поиска и замены для извлечения личных данных. Если имя пакета или класса кажется странным, вот почему.

0 ответов

Вы можете реализовать CclientInterceptor класс, который позволяет настраивать перехват сообщений на стороне клиента.

Проверьте этот учебник: https://codenotfound.com/spring-ws-log-client-server-http-headers.html

Другие вопросы по тегам