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

Java Spring RestTemplate:如何达到检查状态#Is4xExclientError,而不是RestClientException 1st?,java,spring,resttemplate,http-status-codes,Java,Spring,Resttemplate,Http Status Codes,根据我的经验,在调用Spring的RestTemplate#exchange并随后收到“404-Not Found”响应后,会抛出RestClientException,而不是返回一个可以检查其状态的ResponseEntity(即:withResponseEntity#getStatusCode#is4xExclientError) 我不明白为什么HttpStatus 35; is4xxclientorror甚至存在,而不是抛出一个异常,阻止返回响应属性和HttpStatus来调用#is4xc

根据我的经验,在调用Spring的
RestTemplate#exchange
并随后收到“404-Not Found”响应后,会抛出
RestClientException
,而不是返回一个可以检查其状态的
ResponseEntity
(即:with
ResponseEntity#getStatusCode#is4xExclientError

我不明白为什么
HttpStatus 35; is4xxclientorror
甚至存在,而不是抛出一个
异常
,阻止返回
响应属性
HttpStatus
来调用#
is4xclientorror
开启

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

restemplate\exchange
接收到404,而不是被
RestClientException
阻止时,如何使用
restemplate
在Java代码中进入一种状态,在这种状态下,我确实可以检查
RestClientException
?这与
RestTemplate
配置有关吗


或者我的回答是正确的,这实际上是不可能的,而且可能存在
ResponseEntity#getStatusCode#is4xClientError
实际上是一个“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(),如果返回true,则调用可能引发异常的ResponseErrorHandler#handleError()

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

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


一旦拥有了
ResponseEntity
对象,就可以使用ResponseEntity#getStatusCode()#is4xxClientError()方法实现同样的目的

此方法在何处定义
响应性#is4xxclientorror
。我不觉得抱歉,你是对的:这是HttpStatus上的一个方法。所以您可以这样调用:responseEntity.getStatusCode().is4xxClientError();有问题的代码现在已经更正了。我还没有尝试过,但听起来似乎有道理——就像我怀疑的RestTemplate配置一样。所以我接受这个答案,谢谢!