Ниже приведен фрагмент кода; в основном, я пытаюсь распространить исключение, когда код ошибки отличается от 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();
}
Однако в случае ответа 500 от сервера я получаю исключение
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]
Мне действительно нужно оборачивать остальные методы обмена шаблонами в try? В чем тогда заключалась бы цель кодов?
spring
rest
exception-handling
resttemplate
Vaibhav
источник
источник
Ответы:
Вы хотите создать класс, который реализует,
ResponseErrorHandler
а затем использовать его экземпляр, чтобы настроить обработку ошибок вашего шаблона отдыха:Кроме того, в Spring есть класс
DefaultResponseErrorHandler
, который вы можете расширить вместо реализации интерфейса, если вы хотите только переопределитьhandleError
метод.Взгляните на его исходный код, чтобы понять, как Spring обрабатывает ошибки HTTP.
источник
ResourceAccessException
потому чтоRestTemplate.doExecute
ловитIOException
s и выбрасываетResourceAccessException
. Что я делаю не так?Вы должны поймать
HttpStatusCodeException
исключение:источник
Spring разумно обрабатывает коды ошибок http как исключения и предполагает, что ваш код обработки исключений имеет контекст для обработки ошибки. Чтобы обмен работал так, как вы ожидаете, сделайте следующее:
Это вернет все ожидаемые результаты из ответа.
источник
Другое решение - это то, что описано здесь, в конце этого сообщения, пользователем "enlian": http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
источник
Spring абстрагирует вас от очень-очень большого списка кодов состояния http. В этом суть исключений. Взгляните на иерархию org.springframework.web.client.RestClientException:
У вас есть несколько классов для отображения наиболее распространенных ситуаций при работе с HTTP-ответами. Список http-кодов действительно велик, вам не нужно писать код для обработки каждой ситуации. Но, например, взгляните на подиерархию HttpClientErrorException. У вас есть единственное исключение для отображения любой ошибки типа 4xx. Если вам нужно углубиться, то можете. Но просто перехватив HttpClientErrorException, вы можете справиться с любой ситуацией, когда в службу были предоставлены неверные данные.
DefaultResponseErrorHandler действительно прост и надежен. Если код состояния ответа не из семейства 2xx, он просто возвращает true для метода hasError.
источник
Если вы используете механизм объединения (фабрика http-клиента) или балансировки нагрузки (эврика) с вашим
RestTemplate
, у вас не будет роскоши создать отдельныйnew RestTemplate
класс. Если вы вызываете более одной службы, вы не можете использовать ее,setErrorHandler
потому что if будет использоваться глобально для всех ваших запросов.В этом случае
HttpStatusCodeException
лучшим вариантом будет поймать .Единственный другой вариант, который у вас есть, - это определить несколько
RestTemplate
экземпляров с помощью@Qualifier
аннотации.Также - но это мой собственный вкус - мне нравится, что моя обработка ошибок плотно прижимается к моим звонкам.
источник
Я обработал это, как показано ниже:
источник
Код обмена ниже :
Исключение
RestClientException
имеетHttpClientErrorException
иHttpStatusCodeException
исключение.Так что
RestTemplete
здесь могут возникнутьHttpClientErrorException
иHttpStatusCodeException
исключения. В объекте исключения вы можете получить точное сообщение об ошибке следующим образом:exception.getResponseBodyAsString()
Вот пример кода :
Вот описание кода :
В этом методе вы должны передать класс запроса и ответа. Этот метод автоматически анализирует ответ как запрошенный объект.
Прежде всего, вам нужно добавить конвертер сообщений.
Потом надо добавить
requestHeader
. Вот код:Наконец, вам нужно вызвать метод обмена:
Для предварительной печати я использовал библиотеку Gson. вот градиент:
compile 'com.google.code.gson:gson:2.4'
Вы можете просто позвонить по приведенному ниже коду, чтобы получить ответ:
Вот полный рабочий код :
Спасибо :)
источник
Очень простым решением может быть:
источник
Вот мой метод POST с HTTPS, который возвращает тело ответа для любого типа плохих ответов.
источник