Spring RestTemplate: как достичь состояния для проверки # is4xxClientError вместо RestClientException 1st?

По моему опыту, после вызова Spring RestTemplate#exchange, который впоследствии получает ответ «404 - Not Found», выдается RestClientException вместо возврата ResponseEntity, статус которого можно проверить (например, с ResponseEntity#getStatusCode#is4xxClientError).

Я не понимаю, почему HttpStatus#is4xxClientError вообще существует, если вместо этого выбрасывается Exception, который не позволяет вернуть ResponseEntity с HttpStatus для вызова # is4xxClientError на ...

Я обоснованно убежден, что то, что я только что описал, является реальной ситуацией, потому что я могу найти в Интернете другие учетные записи, подтверждающие это (например, Spring MVC - исключение запуска RestTemplate при возникновении http 404).

Как я могу перейти в состояние в коде Java с помощью RestTemplate, когда я действительно могу проверить ResponseEntity#getStatusCode#is4xxClientError, когда RestTemplate#exchange получает 404, а не RestClientException? Это как-то связано с конфигурацией RestTemplate?

Или я прав, что на самом деле это невозможно, и, может быть, существование ResponseEntity#getStatusCode#is4xxClientError на самом деле является «ошибкой»?

Где этот метод определен ResponseEntity#is4xxClientError. Не нашел docs.spring.io/spring-framework/docs/current/javadoc-api/org‌ /…

Pratapi Hemant Patel 08.05.2018 19:55

Извините, что вы правы: это метод на HttpStatus. Итак, вы бы вызывали его так: responseEntity.getStatusCode (). Is4xxClientError ();

cellepo 08.05.2018 21:58

Рассматриваемый код исправлен.

cellepo 08.05.2018 22:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 025
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

RestTemplate имеет метод

public void setErrorHandler(ResponseErrorHandler errorHandler);

А интерфейс ResponseErrorHandler выглядит так.

public interface ResponseErrorHandler {

    boolean hasError(ClientHttpResponse response) throws IOException;

    void handleError(ClientHttpResponse response) throws IOException;
}

Всякий раз, когда RestTemplate обрабатывает ответ, он сначала вызывает ResponseErrorHandler # hasError (), если он возвращает истину, вызывается ResponseErrorHandler # handleError (), что может вызвать исключение.

Если вы не установите ResponseErrorHandler # setErrorHandler (), по умолчанию будет DefaultResponseErrorHandler.java.
Реализация по умолчанию обрабатывает код состояния серии 4xx / 5xx как ошибку и выдает исключение RestClientException (не это исключение, а подклассы этого исключения).

Вы всегда можете написать свой собственный ResponseErrorHandler и переопределить поведение по умолчанию. Таким образом, вы можете получить объект ResponseEntity даже в случае 4xx / 5xx (написав свою собственную реализацию ResponseErrorHandler и всегда возвращая false из метода hasError()).

Если у вас есть объект ResponseEntity, вы можете использовать метод ResponseEntity # getStatusCode () # is4xxClientError () для той же цели.

Я еще не пробовал это, но похоже, что это имеет смысл - в соответствии с конфигурацией RestTemplate, о которой я подозревал. Так что я принимаю этот ответ, спасибо!

cellepo 08.05.2018 22:08

Другие вопросы по теме