2016-06-29 9 views
31

Unten ist das Code-Snippet; im Grunde versuche ich, die Ausnahme zu propagieren, wenn der Code Fehler ist etwas anderes als 200.Spring Resttemplate-Ausnahmebehandlung

ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version), 
        HttpMethod.POST, entity, Object.class); 
      if(response.getStatusCode().value()!= 200){ 
       logger.debug("Encountered Error while Calling API"); 
       throw new ApplicationException(); 
      } 

jedoch im Fall einer 500 Antwort vom Server erhalte ich die Ausnahme

org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] 

Do Ich muss wirklich die Rest-Template-Exchange-Methode in Versuch wickeln? Was wäre dann der Zweck von Codes?

+0

bitte den Code von Application teilen() – Mudassar

+0

Mögliche Duplikat [Frühling RestTemplate - Übergeordnete ResponseErrorHandler] (https://stackoverflow.com/questions/23838752/spring-resttemplate-overriding-responseerrorhandler) –

Antwort

45

Sie wollen eine Klasse erstellen, die ResponseErrorHandler implementiert und dann eine Instanz davon verwenden, um die Fehlerbehandlung Ihrer Ruhe Vorlage zu setzen:

public class MyErrorHandler implements ResponseErrorHandler { 
    @Override 
    public void handleError(ClientHttpResponse response) throws IOException { 
    // your error handling here 
    } 

    @Override 
    public boolean hasError(ClientHttpResponse response) throws IOException { 
    ... 
    } 
} 

[...] 

public static void main(String args[]) { 
    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setErrorHandler(new MyErrorHandler()); 
} 

Außerdem hat Spring die Klasse DefaultResponseErrorHandler, die Sie erweitern können, anstatt die Schnittstelle zu implementieren, falls Sie nur die handleError-Methode überschreiben möchten.

public class MyErrorHandler extends DefaultResponseErrorHandler { 
    @Override 
    public void handleError(ClientHttpResponse response) throws IOException { 
    // your error handling here 
    } 
} 

Werfen Sie einen Blick auf seine source code eine Vorstellung davon zu haben, wie HTTP-Fehler Frühling behandelt.

15

sollten Sie eine HttpStatusCodeException Ausnahme abfangen:

try { 
    restTemplate.exchange(...); 
} catch (HttpStatusCodeException exception) { 
    int statusCode = exception.getStatusCode().value(); 
    ... 
} 
+7

IMO sollte die Antwort immer kommen mit einem entsprechenden Statuscode, ansonsten ist der Zweck der Codes. – vaibhav

+3

Ich bin mir nicht sicher, @vaibhav Einwand zu verstehen: fangen HttpStatusCodeException ist nicht für einen falschen Code, sondern weil in vielen Fällen eine Ausnahme immer geworfen wird und so Ihre if (Code == Wert) kann nie ausgeführt werden. –

+1

Ausnahmen sind in Java sehr teuer. Es ist ok für die gelegentlichen, unerwarteten Ursachen (daher der Name), aber darüber hinaus sollten Sie stattdessen nach anderen Lösungen suchen. –

0

Wenn Sie Pooling (http Client Factory) oder Load Balancing (Eureka) Mechanismus mit Ihrem RestTemplate verwenden, werden Sie nicht den Luxus haben, eine new RestTemplate pro Klasse zu erstellen. Wenn Sie mehr als einen Dienst aufrufen, können Sie setErrorHandler nicht verwenden, da dies global für alle Ihre Anfragen verwendet würde.

In diesem Fall scheint das Auffangen der HttpStatusCodeException die bessere Option zu sein.

Die einzige andere Option, die Sie haben, ist mehrere RestTemplate Instanzen mit der @Qualifier Annotation zu definieren.

Auch - aber das ist mein eigener Geschmack - Ich mag meine Fehlerbehandlung eng an meine Anrufe gekuschelt.