Spring RestTemplate:如何到达状态来检查 #is4xxClientError,而不是第一个 RestClientException?

问题描述 投票:0回答:1

根据我的经验,在调用 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
的存在实际上是一个“错误”?

java spring resttemplate http-status-codes
1个回答
5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.