2017-02-06 5 views
1

Ich verwende ClientInterceptor, um alle externen Soap-Anrufe von meiner Anwendung abzufangen und die Anfrage und Antwort zu protokollieren. Ich kann die Anfrage-/Antwort- und Fehlerszenarien erfassen. Wenn jedoch ein 404-Fehler aufgrund einer falschen Konfiguration des Endpunkts angezeigt wird, kann ich dies nicht mit den von dieser Schnittstelle bereitgestellten Methoden erfassen. Gibt es eine Möglichkeit, 404-Fehler mit dieser Schnittstelle zu erfassen? Wenn nicht, können Sie mir bitte helfen, mir die Alternative zu erklären, die ich erforschen muss?ClientInterceptor - Erfassen von 404 Szenarien

org.springframework.ws.client.support.interceptor.ClientInterceptor

Antwort

3

Die org.springframework.ws.client.support.interceptor.ClientInterceptor.handleFault() nur Anzüge für die Prozesse der eingehenden Antwortfehler abfängt. Das sind die SOAP-Fehler, die durch die Spezifikation definiert sind. So definieren die SOAP 1.1 und 1.2 Spezifikationen einen Status-Codes, die im Falle von SOAP-Fehlern (zum Beispiel im Fall von fehlerhaften XML in der Anfrage Nachricht Umschlag) zurückgegeben werden. SOAP 1.1 spezifiziert einen 500 Statuscode für Fehler und SOAP 1.2 spezifiziert einen 400 Statuscode für Senderfehler und 500 für alle anderen Fehler. Im Falle von Fehlern gibt der Server eine SOAP-Nachricht in der Antwort zurück, die ein SOAP Fault-Element enthält, das dann an die Methoden ClientInterceptor.handleFault() übergeben werden kann. Der Statuscode 404 gibt jedoch an, dass es sich nicht um einen SOAP-Fehler, sondern um einen Systemfehler handelt. Wenn Sie diesen Fall ebenfalls bearbeiten müssen, müssen Sie stattdessen die Methode WebServiceTemplate.handleError() überschreiben. Dadurch wird der Trick

public class CustomWebServiceTemplate extends WebServiceTemplate{ 

    @Override 
    protected Object handleError(WebServiceConnection connection, WebServiceMessage request) throws IOException { 
     log.info("Log the error case in here"); 
     return super.handleError(connection, request); 
    } 
} 
+0

Dank @Babl tun

. Gibt es eine Möglichkeit, das MessageContext-Objekt in der handleError-Methode abzurufen? –

+0

Ich habe einige Eigenschaften in messagecontext als Teil der handleRequest-Methode festgelegt. Wenn ich die Timeout-Antwort mit der Methode handleError behandeln muss, gibt es eine Möglichkeit für mich, auf die Elemente in messagecontext zuzugreifen? –

+0

Kein einfacher Weg, ich meine, nichts ist unmöglich, aber Sie müssen das 'WebServiceTemplate .doSendAndReceive' überschreiben, um völlig benutzerdefinierte Dinge zu haben ... Das Problem mit der Standardimplementierung ist die Tatsache, dass es nur die Anfrage an' handleError' sendet Methode wie 'handleError (Verbindung, messageContext.getRequest());'. Wenn Sie es wirklich brauchen, müssen Sie ein bisschen mit 'WebServiceTemplate .doSendAndReceive' spielen. – Babl