2017-05-16 2 views
3

Ich entwickle eine REST-Client-Bibliothek und einen REST-Server mit Spring/Spring-Boot. Die Bibliothek wird als Abhängigkeit in anderen Anwendungen verwendet.rest webservices Ausnahmebehandlung mit Spring Boot

Was ist der beste Weg, um Fehler zu behandeln, dachte ich über die Behandlung des Fehlers auf der Serverseite mit z. B. ControllerAdvice, um Fehler zu einer Fehler DTO-Klasse zuzuordnen. Auf der Clientseite (die RestTemplate verwendet) Ich möchte:

  1. Fehlerfall (Antwort 4xx/5xx), dann Fehler DTO deserialisieren und geprüfte Ausnahme werfen (die in den Anwendungen verwendet werden, die behandelt werden muss, die Bibliothek)
  2. im Normalfall einfach das erwartete DTO-Objekt deserialisieren und zurückgeben.

Ich habe versucht, das zu erreichen mit ResponseErrorHandler und ich kam mit zwei Lösungen auf, die mir nicht ganz erfüllen, so würde Ich mag eine Meinung über sie hören oder ein paar bessere Vorschläge erhalten:

Idee 1:

public List<SomeDTO> list() throws MyException { 
    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); 
    HttpEntity<String> request = new HttpEntity<>(headers); 
    ResponseEntity<String> response = restTemplate.exchange("endpoint/getAll", HttpMethod.GET, request, String.class); 
    String responseBody = response.getBody(); 
    try { 
     if (MyResponseErrorHandler.isError(response.getStatusCode())) { 
      ErrorInfo error = objectMapper.readValue(responseBody, ErrorInfo.class); 
      throw new MyException(); 
     } else { 
      List<SomeDTO> SomeDTOs = Arrays.asList(objectMapper.readValue(responseBody)); 
      return SomeDTOs; 
     } 
    } catch (IOException e) { 
     throw new MyException(); 
    } 
} 

Aber es sieht aus wie eine Menge Textvorschlag für jede Methode.

Idee 2 A

throw benutzerdefinierte Ausnahme in ResponseErrorHandler, die Laufzeit oder IOException sein muss, aber im Falle von IOException mit ResourceAccessException gewickelt. In der Client-Methode konnte die Exception abgefangen und eine weitere erneut ausgelöst werden. Aber irgendwo (in catch-Block?) Die Fehlerreaktion muss benutzerdefinierte Ausnahme zugeordnet werden (was auch IOException werfen kann)

Idee 2 B nicht verwenden ResponseErrorHandler, catch HttpClientErrorException, Antworttext von ihm erhalten in der catch-Block mit getResponseBodyAsString, es auf benutzerdefinierten Fehlertyp zuordnen (IOException abfangen))

Irgendwelche Gedanken? Vielen Dank im Voraus

+0

Was ist das Problem mit 'ControllerAdvice'? Es hilft (zumindest ich: P) die eigentliche Logik und die Ausnahmebehandlung zu entkoppeln. – ansh

Antwort

0

Die Standardmethode zur Rückgabe eines Fehlers in REST API ist HTTP-Codes.

Aber in diesem Fall entwickeln Sie die Client-Bibliothek, so dass Sie die Option haben, es zu Ihrem eigenen Design zu machen.

Ich hatte diese Situation auch. Obwohl nur die Client-Bibliothek von anderen Personen verwendet wird. Daher ist die REST-API für sie verborgen. Obwohl ich die bekannten Ausnahmen von ControllerAdvice behandelte und immer ein Objekt wie int code; String message; Object payload; zurückgibt, ist Offensichtlich immer der HTTP-Code 200 (OK).

Der Vorteil, Antwortcode als ENUM zu haben, um alle Fehler zu erhalten, die ich gehandhabt habe, einschließlich spezifische Nachricht, um Ausnahme im Klienten zu verursachen und ich kenne die spezifische Klasse des Nutzlastgegenstandes auch (für erfolgreiche Anforderungen). Auf der Client-Seite erleichtern diese Rückkehrcodes (ENUM) das Auslösen von Ausnahmen von der Clientseite.

Verwandte Themen