Java Spring RestTemplate:如何达到检查状态#Is4xExclientError,而不是RestClientException 1st?
根据我的经验,在调用Spring的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
RestTemplate#exchange
并随后收到“404-Not Found”响应后,会抛出RestClientException
,而不是返回一个可以检查其状态的ResponseEntity
(即:withResponseEntity#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配置一样。所以我接受这个答案,谢谢!