spring boot / cloud (二) 规范响应格式以及统一异常处理
2024-10-13 17:17:48
spring boot / cloud (二) 规范响应格式以及统一异常处理
前言
为什么规范响应格式?
我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队间接口对接的效率(前端和后端,后端和后端等).
思路
自定义统一的ResposeBody类 : 用于统一响应格式
自定义统一的Error类 : 用于统一异常格式
自定义异常 : 区分不同场景的异常
实现ExceptionHandler : 用于拦截处理异常
实现
1.创建ErrorResult类
public class ErrorResult implements Serializable {
........省略
//异常发生时间
private Date exceptionDate;
//异常类名
private String exceptionType;
//异常描述
private String exceptionMessage;
//异常堆栈
private String exceptionStackTrace;
........省略
}
2.创建RestResponse类
使用泛型,来适应不同类型的结果集
响应代码和响应描述,可自定义枚举来规范
注意,一定有留有无参的构造函数,否则json转换会报错
public class RestResponse<T> implements Serializable {
........省略
//响应ID
private String id = UUID.randomUUID().toString();
//响应代码
private String code = "SUCCESS";
//响应描述
private String message = "操作成功";
//响应体
private T result = null;
//错误体
private ErrorResult error = null;
//构造函数
public RestResponse() {
super();
}
//构造函数
public RestResponse(ErrorCode errorCode, ErrorResult error) {
super();
this.code = errorCode.name();
this.message = errorCode.value();
this.error = error;
}
........省略
}
3.自定义异常
检查型异常
public class SystemException extends Exception {
........省略
}
运行时异常
public class SystemRuntimeException extends RuntimeException {
........省略
}
其他类型异常,如:认证异常,权限异常,参数校验异常,等等,按需定义
public class AuthException extends RuntimeException {
........省略
}
4.创建ExceptionMapping类
@ControllerAdvice
public class ExceptionMapping {
........省略
}
定义私有的方法构造ErrorResult
private ErrorResult buildError(Exception exception) {
ErrorResult error = new ErrorResult();
error.setType(exception.getClass().getName());
error.setMessage(ExceptionUtils.getMessage(exception));
error.setStackTrace(ExceptionUtils.getStackTrace(exception));
error.setDate(new Date());
return error;
}
按照异常类型,拦截处理异常,拦截的优先级遵循类的集成关系,优先拦截子类异常
@ExceptionHandler(value = 要拦截的异常.class)
@ResponseStatus(响应状态)
@ResponseBody
public RestResponse<String> exception(要拦截的异常 exception) {
return new RestResponse<>(ErrorCode.ERROR, buildError(exception));
}
这里提醒注意点,如果想要拦截404错误的话,需要在spring boot中做如下设置
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
代码仓库 (博客配套代码)
结束
然后相关思路和原则,大家可自行搜索契约优先
,由于本身不想在文章中引入太多教条性的东西,主要都是以解决问题的思路为主,所以不深入讨论.
想获得最快更新,请关注公众号
最新文章
- 支撑Java NIO 与 NodeJS的底层技术
- VMWare虚拟机下为Ubuntu 12.04.1配置静态IP_转
- 3.3 使用Code First数据库迁移
- nginx 配置 ThinkPHP Rewrite
- jQuery之手势密码
- java List 去重(两种方式)
- httpServer V1
- UIView的常见属性
- python 文件中的中文编码解决方法
- Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)
- SqlServer数据库存储过程的使用
- Identity
- Redis持久化的两种方式(RDB和AOF)
- 案例学编程系列:案例认识 Spring IOC
- 阶段01Java基础day22IO流03
- beego orm操蛋问题:操作都需要主键
- mysql学习------MySQL慢查询日志
- 学校网站UI设计分析
- spring远程服务知识梳理
- 用原生JS实现getElementsByClass
热门文章
- centos7安装nodejs
- java基础06 IO流
- Android - FEATURE_NO_TITLE
- Codeforces_776B: Sherlock and his girlfriend(素数筛)
- SLAM中的优化理论(一)—— 线性最小二乘
- MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结
- Java IO(一):IO和File
- Android学习笔记-TextView(文本框)(一)
- pygal的简单使用
- 关于在HTML中使用的script标签