首页 > 解决方案 > Spring RestTemplate:如何达到状态以检查#is4xxClientError,而不是 RestClientException 1st?

问题描述

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

我不明白为什么HttpStatus#is4xxClientError如果Exception抛出一个阻止返回一个ResponseEntitywithHttpStatus来调用 # is4xxClientErroron ...

我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来确认这一点(即:Spring MVC - RestTemplate 在 http 404 发生时启动异常)。

如何使用RestTemplate我确实可以检查ResponseEntity#getStatusCode#is4xxClientError 何时RestTemplate#exchange收到 404,而不是被RestClientException? 和RestTemplate配置有关系吗?

或者我是正确的,这实际上是不可能的,也许存在ResponseEntity#getStatusCode#is4xxClientError实际上是一个“错误”?

标签: javaspringresttemplatehttp-status-codes

解决方案


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()方法来达到同样的目的。


推荐阅读