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:
- 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)
- 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
Was ist das Problem mit 'ControllerAdvice'? Es hilft (zumindest ich: P) die eigentliche Logik und die Ausnahmebehandlung zu entkoppeln. – ansh