Spring RestTemplate: Как достичь состояния, чтобы проверить # is4xxClientError, а не RestClientException 1-й? - PullRequest
0 голосов
/ 08 мая 2018

По моему опыту, после вызова RestTemplate#exchange Spring, который впоследствии получает ответ «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 на самом деле является «ошибкой»?

1 Ответ

0 голосов
/ 08 мая 2018

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 () , если он возвращает true, ResponseErrorHandler # handleError () вызывается, что может выбросить исключение.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...