定制RestTemplate:处理非200状态请求异常
版权申诉
142 浏览量
更新于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 上传
2022-07-03 上传
2023-11-29 上传
2022-06-26 上传
小兔子平安
- 粉丝: 251
- 资源: 1940
最新资源
- NIST REFPROP问题反馈与解决方案存储库
- 掌握LeetCode习题的系统开源答案
- ctop:实现汉字按首字母拼音分类排序的PHP工具
- 微信小程序课程学习——投资融资类产品说明
- Matlab犯罪模拟器开发:探索《当蛮力失败》犯罪惩罚模型
- Java网上招聘系统实战项目源码及部署教程
- OneSky APIPHP5库:PHP5.1及以上版本的API集成
- 实时监控MySQL导入进度的bash脚本技巧
- 使用MATLAB开发交流电压脉冲生成控制系统
- ESP32安全OTA更新:原生API与WebSocket加密传输
- Sonic-Sharp: 基于《刺猬索尼克》的开源C#游戏引擎
- Java文章发布系统源码及部署教程
- CQUPT Python课程代码资源完整分享
- 易语言实现获取目录尺寸的Scripting.FileSystemObject对象方法
- Excel宾果卡生成器:自定义和打印多张卡片
- 使用HALCON实现图像二维码自动读取与解码