По моему опыту, после вызова 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 на самом деле является «ошибкой»?
Извините, что вы правы: это метод на HttpStatus. Итак, вы бы вызывали его так: responseEntity.getStatusCode (). Is4xxClientError ();
Рассматриваемый код исправлен.




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, о которой я подозревал. Так что я принимаю этот ответ, спасибо!
Где этот метод определен
ResponseEntity#is4xxClientError. Не нашел docs.spring.io/spring-framework/docs/current/javadoc-api/org /…