java - Spring RestTemplate:如何达到状态以检查#is4xxClientError,而不是 RestClientException 1st?
问题描述
RestTemplate#exchange
以我的经验,在调用随后收到“404 - Not Found”响应的Spring之后,RestClientException
抛出 a 而不是返回ResponseEntity
可以检查其状态的 a (即: with ResponseEntity#getStatusCode#is4xxClientError
)。
我不明白为什么HttpStatus#is4xxClientError
如果Exception
抛出一个阻止返回一个ResponseEntity
withHttpStatus
来调用 # is4xxClientError
on ...
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来确认这一点(即:Spring MVC - RestTemplate 在 http 404 发生时启动异常)。
如何使用RestTemplate
我确实可以检查ResponseEntity#getStatusCode#is4xxClientError
何时RestTemplate#exchange
收到 404,而不是被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()方法来达到同样的目的。
推荐阅读
- ios - 即使我在 iOS 的另一个选项卡中,如何返回根视图控制器?
- django - 用于删除帖子的 Django 测试用例返回 Https 200 而不是 302
- python-3.x - Python Selenium:元素未附加到页面文档
- kotlin - Exposed 中的 default 和 clientDefault 函数有什么不同?
- scrapy - 在执行之前将时间戳参数插入到scrapy请求中
- sql - SQL/PowerBI 在数据的特定行(不是行)中搜索
- javascript - 错误代码“模型“user”的路径“_id”处的值“find”转换为 ObjectId 失败
- cassandra - 如何以及在何处配置 DSE Opscenter 堆大小和任何其他 JVM 参数
- python - OSX Catalina 更新后找不到 pip、conda、python 模块
- php - 为什么 false[0] 不会为未定义的偏移量抛出错误?