Spring RestTemplate:如何到达状态以检查#is4xxClientError,而不是 RestClientException 1st?

Spring RestTemplate: How to reach state to check #is4xxClientError, instead of RestClientException 1st?

根据我的经验,在调用 Spring 的 RestTemplate#exchange 之后收到“404 - Not Found”响应后,抛出 RestClientException 而不是返回 ResponseEntity 可以检查其状态(即:使用 ResponseEntity#getStatusCode#is4xxClientError)。

我不明白为什么 HttpStatus#is4xxClientError 甚至存在,如果抛出 Exception 阻止返回 ResponseEntityHttpStatus 来调用 #is4xxClientError 在...

我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来证实这一点(即:)。

如何使用 RestTemplate 进入 Java 代码状态,在 RestTemplate#exchange 收到 404 时我确实可以检查 ResponseEntity#getStatusCode#is4xxClientError,而不是被RestClientException?与RestTemplate配置有关吗?

或者我说得对,实际上不可能,也许 ResponseEntity#getStatusCode#is4xxClientError 的存在实际上是一个 'bug'?

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(),如果 returns 为真,ResponseErrorHandler#handleError() 被调用,可能会抛出异常。

如果不设置ResponseErrorHandler#setErrorHandler(),默认为DefaultResponseErrorHandler.java.
默认实现将 4xx / 5xx 系列状态代码视为错误并抛出 RestClientException(不是此异常,而是此异常的子类)。

您始终可以编写自己的 ResponseErrorHandler 并覆盖默认行为。因此,即使在 4xx / 5xx 的情况下,您也可以通过这种方式获得 ResponseEntity 对象(通过编写自己的 ResponseErrorHandler 实现并始终从方法返回 false hasError()).

获得 ResponseEntity 对象后,您可以使用 ResponseEntity#getStatusCode()#is4xxClientError() 方法达到相同目的。