Методы RestTemplate
, такие как postForEntity()
throw RestClientException
. Я хотел бы извлечь код состояния HTTP и тело ответа из этого объекта исключения в блоке catch. Как я могу это сделать?
Как получить код состояния HTTP и тело ответа при возникновении RestClientException?
Ответы (4)
Вместо того, чтобы ловить RestClientException
, ловите специальный HttpClientErrorException
.
Вот пример:
try {
Link dataCenterLink = serviceInstance.getLink("dataCenter");
String dataCenterUrl = dataCenterLink.getHref();
DataCenterResource dataCenter =
restTemplate.getForObject(dataCenterUrl, DataCenterResource.class);
serviceInstance.setDataCenter(dataCenter);
} catch (HttpClientErrorException e) {
HttpStatus status = e.getStatusCode();
if (status != HttpStatus.NOT_FOUND) { throw e; }
}
HttpClientErrorException
предоставляет getStatusCode
и getResponseBodyAsByteArray
, чтобы получить код состояния и тело соответственно.
HttpStatusCodeException
наследуется HttpClientErrorException
и HttpServerErrorException
.
- person Dariush Jafari; 15.02.2018
HttpStatusCodeException
, у вас будет доступ к методу getResponseBodyAsString()
.
- person Nikhil Sahu; 16.11.2018
Вместо этого поймайте RestClientResponseException
. Это более общее.
Из документов : общий базовый класс для исключений, содержащих фактические данные ответа HTTP.
В некоторых случаях HttpClientErrorException не создается. Например, вызов следующего метода restTemplate.exchange:
ResponseEntity<Employee[]> employees = restTemplate.exchange(url, HttpMethod.GET, entity, Employee[].class);
Получает тело http и упорядочивает его объекту. Если удаленный ресурс возвращает редкую ошибку, внутренний сортировщик не работает, и выдается просто RestClientException.
restTemplate.setErrorHandler
В этом случае или если вы хотите обработать любую ошибку в операциях restTemplate, вы можете использовать setErrorHandler. Этот метод получает базовый ResponseErrorHandler с полезными методами.
Этот метод hasError позволил мне получить основной текст удаленного http и помог мне обнаружить ошибку вызова или в удаленном удаленном http-ресурсе:
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse arg0) throws IOException {
System.out.println("StatusCode from remote http resource:"+arg0.getStatusCode());
System.out.println("RawStatusCode from remote http resource:"+arg0.getRawStatusCode());
System.out.println("StatusText from remote http resource:"+arg0.getStatusText());
String body = new BufferedReader(new InputStreamReader(arg0.getBody()))
.lines().collect(Collectors.joining("\n"));
System.out.println("Error body from remote http resource:"+body);
return false;
}
@Override
public void handleError(ClientHttpResponse arg0) throws IOException {
// do something
}
});
Кроме того, вы можете вручную оценить тело или статус и вернуть true или false, чтобы пометить как ошибку или нет.