Poniżej znajduje się fragment kodu; zasadniczo próbuję propagować wyjątek, gdy kod błędu jest inny niż 200.
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();
}
Jednak w przypadku odpowiedzi 500 z serwera otrzymuję wyjątek
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]
Czy naprawdę muszę wypróbować metodę wymiany szablonów reszt? Jaki byłby wówczas cel kodów?
spring
rest
exception-handling
resttemplate
vaibhav
źródło
źródło
Odpowiedzi:
Chcesz utworzyć klasę, która implementuje,
ResponseErrorHandler
a następnie użyć jej instancji, aby ustawić obsługę błędów w szablonie REST:Ponadto Spring ma klasę
DefaultResponseErrorHandler
, którą możesz rozszerzyć zamiast implementować interfejs, jeśli chcesz tylko przesłonićhandleError
metodę.Spójrz na jego kod źródłowy, aby dowiedzieć się, jak Spring obsługuje błędy HTTP.
źródło
ResourceAccessException
ponieważRestTemplate.doExecute
łapieIOException
si i rzucaResourceAccessException
. Co ja robię źle?Powinieneś złapać
HttpStatusCodeException
wyjątek:źródło
Spring sprytnie traktuje kody błędów http jako wyjątki i zakłada, że kod obsługi wyjątków ma kontekst do obsługi błędu. Aby wymiana działała tak, jak byś tego oczekiwał, wykonaj następujące czynności:
To zwróci wszystkie oczekiwane wyniki odpowiedzi.
źródło
Innym rozwiązaniem jest to opisane tutaj na końcu tego posta przez „enlian”: http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
źródło
Spring wyrywa cię z bardzo, bardzo dużej listy kodów statusu http. Taka jest idea wyjątków. Przyjrzyj się hierarchii org.springframework.web.client.RestClientException:
Masz kilka klas do mapowania najczęstszych sytuacji, gdy mamy do czynienia z odpowiedziami http. Lista kodów http jest naprawdę duża, nie będziesz chciał pisać kodu do obsługi każdej sytuacji. Ale na przykład spójrz na hierarchię podrzędną HttpClientErrorException. Masz jeden wyjątek do mapowania dowolnego rodzaju błędu 4xx. Jeśli chcesz wejść głęboko, możesz. Ale po prostu przechwytując HttpClientErrorException, możesz obsłużyć każdą sytuację, w której złe dane zostały dostarczone do usługi.
DefaultResponseErrorHandler jest naprawdę prosty i solidny. Jeśli kod statusu odpowiedzi nie pochodzi z rodziny 2xx, zwraca po prostu wartość true dla metody hasError.
źródło
Jeśli korzystasz z mechanizmu buforowania (fabryka klientów http) lub równoważenia obciążenia (eureka)
RestTemplate
, nie będziesz mieć luksusu tworzenianew RestTemplate
osobnej klasy. Jeśli dzwonisz do więcej niż jednej usługi, nie możesz z niej skorzystać,setErrorHandler
ponieważ byłaby używana globalnie dla wszystkich Twoich żądań.W tym przypadku
HttpStatusCodeException
lepszym rozwiązaniem wydaje się złapanie .Jedyną inną opcją, jaką masz, jest zdefiniowanie wielu
RestTemplate
instancji za pomocą@Qualifier
adnotacji.Poza tym - ale to mój własny gust - podoba mi się obsługa błędów ściśle dopasowana do moich rozmów.
źródło
Zrobiłem to jak poniżej:
źródło
Kod wymiany znajduje się poniżej :
Wyjątek
RestClientException
maHttpClientErrorException
iHttpStatusCodeException
wyjątek.Więc
RestTemplete
może się zdarzyćHttpClientErrorException
iHttpStatusCodeException
wyjątek. W obiekcie wyjątku możesz uzyskać dokładny komunikat o błędzie w ten sposób:exception.getResponseBodyAsString()
Oto przykładowy kod :
Oto opis kodu :
W tej metodzie musisz przekazać klasę żądania i odpowiedzi. Ta metoda automatycznie przeanalizuje odpowiedź jako żądany obiekt.
Przede wszystkim musisz dodać konwerter wiadomości.
Następnie musisz dodać
requestHeader
. Oto kod:Na koniec musisz wywołać metodę wymiany:
Do druku prety użyłem biblioteki Gson. oto klasa:
compile 'com.google.code.gson:gson:2.4'
Możesz po prostu zadzwonić pod poniższy kod, aby uzyskać odpowiedź:
Oto pełny działający kod :
Dzięki :)
źródło
Bardzo prostym rozwiązaniem może być:
źródło
Oto moja metoda POST z HTTPS, która zwraca treść odpowiedzi dla dowolnego typu złych odpowiedzi.
źródło