根据我的经验,在调用 Spring 的
RestTemplate#exchange
随后收到“404 - Not Found”响应后,会抛出 RestClientException
,而不是返回可以检查其状态的 ResponseEntity
(即:使用 ResponseEntity#getStatusCode#is4xxClientError
)。
我不明白为什么
HttpStatus#is4xxClientError
甚至存在,如果相反抛出一个Exception
,阻止返回带有ResponseEntity
的HttpStatus
来调用#is4xxClientError
...
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来确认这一点(即:Spring MVC - RestTemplate launch exception when http 404发生)。
如何使用
RestTemplate
进入 Java 代码中的状态,当 ResponseEntity#getStatusCode#is4xxClientError
收到 404 时,我确实可以检查 RestTemplate#exchange
,而不是被 RestClientException
阻止? 这与 RestTemplate
有关吗?
配置?
或者我是否正确,这实际上是不可能的,也许
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(),如果返回true,则调用ResponseErrorHandler#handleError(),这可能会抛出异常。
如果不设置 ResponseErrorHandler#setErrorHandler(),则默认为 DefaultResponseErrorHandler.java。
默认实现将 4xx / 5xx 系列状态代码视为错误并抛出 RestClientException (不是此异常,而是此异常的子类)。
您始终可以编写自己的 ResponseErrorHandler 并覆盖默认行为。因此,即使在 4xx / 5xx 的情况下,您也可以获得 ResponseEntity 对象(通过编写您自己的
ResponseErrorHandler
实现并始终从方法 false
返回 hasError()
)。
一旦有了
ResponseEntity
对象,您就可以使用 ResponseEntity#getStatusCode()#is4xxClientError() 方法来达到相同目的。