定制RestTemplate:处理非200状态请求异常
版权申诉
55 浏览量
更新于2024-08-08
收藏 455KB DOCX 举报
在Java中,使用Spring框架的RestTemplate进行远程API调用时,我们可能会遇到请求失败的情况,如服务超时、服务不存在等,这些情况下返回的状态码通常是非200,如404或500。默认情况下,当这样的异常发生时,RestTemplate会抛出一个异常,导致后续代码无法执行。这可能不符合实际业务需求,因为我们希望在任何异常情况下都能得到HTTP请求结果的状态信息,而不是中断程序。
为了解决这个问题,RestTemplate允许我们自定义请求结果的异常处理机制。它提供了一个名为ResponseErrorHandler的接口,这个接口有两个关键方法:
1. `hasError(HttpResponse response)`:这个方法用于检查HttpResponse是否表示一个异常响应,通常是通过检查状态码来决定。如果状态码不在200的成功范围内,`hasError`方法会返回true,表明存在异常。
2. ` handleError(HttpResponse response)`:当`hasError`方法返回true时,`handleError`方法会被调用,用于处理异常响应。默认情况下,Spring的DefaultResponseErrorHandler实现了这个接口,并在状态码为非200时,抛出了HttpServerErrorException异常。
然而,这种默认行为并不总是满足我们的业务场景。为了改变这种处理方式,我们可以自定义一个ResponseErrorHandler实现,例如:
```java
public class CustomResponseErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(HttpResponse response) {
// 自定义判断条件,比如只对404和500异常感兴趣
HttpStatus status = response.getStatusCode();
return !status.isSuccess() && (status.getCode() == HttpStatus.NOT_FOUND.value() || status.getCode() == HttpStatus.INTERNAL_SERVER_ERROR.value());
}
@Override
public void handleError(HttpResponse response) {
try {
// 在这里处理非200状态的HTTP响应,比如获取错误消息或转换成统一的错误对象
String errorMessage = response.getBodyAsString(); // 假设body包含错误信息
// 创建自定义的错误对象并记录日志或返回给前端
MyCustomError customError = new MyCustomError(errorMessage, response.getStatusCode());
// 或者直接返回错误状态和消息
throw new CustomException(customError.getMessage(), customError.getStatusCode());
} catch (IOException e) {
// 处理解析错误
// ...
}
}
}
```
然后,在RestTemplate的配置中设置自定义的ResponseErrorHandler:
```java
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new CustomResponseErrorHandler());
```
这样,当请求失败时,将会调用自定义的错误处理逻辑,从而得到预期的HTTP请求结果状态,而不会因为异常中断程序的执行。这种灵活性使得开发者能够更好地控制异常处理流程,以适应不同业务场景的需求。
2022-06-26 上传
2023-11-29 上传
2022-06-26 上传
2020-11-26 上传
小兔子平安
- 粉丝: 255
- 资源: 1940
最新资源
- 收集的vc button 按钮源代码,仿iphone界面
- 易语言标签批量打印源码.zip
- GIMworld一键集运插件-crx插件
- react-webpack-boilerplate
- adb命令读/写操作: 可以嵌入到代码中执行
- rest-delphi:API分离和Delphi XE10 usando框架马
- 宁德新能源科技-电子签章.zip
- 跨时钟域问题解决方法.rar
- LeetCode:解决LeetCode的问题
- 基于大语言模型的交互式视频检索引擎,使用python+Django框架实现的
- HSTimestamp:这是一个库。 关于时间戳。 您可以使用它来获取当前时间戳,并获得有关time-ago的功能。
- 通用adb调试工具下载
- CS1699-Deliverable3:皮特 CS 1699 - 可交付成果 #3
- VC++动态设置窗体内文字的颜色
- AGBooks:教科书分发解决方案
- libqtcp:通过网络提供通信的库-开源