spring boot / cloud (二) 规范响应格式以及统一异常处理
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
代码仓库 (博客配套代码)
结束
然后相关思路和原则,大家可自行搜索契约优先,由于本身不想在文章中引入太多教条性的东西,主要都是以解决问题的思路为主,所以不深入讨论.
想获得最快更新,请关注公众号

spring boot / cloud (二) 规范响应格式以及统一异常处理的更多相关文章
- spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求
spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...
- spring boot / cloud (十二) 异常统一处理进阶
spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- spring boot / cloud (三) 集成springfox-swagger2构建在线API文档
spring boot / cloud (三) 集成springfox-swagger2构建在线API文档 前言 不能同步更新API文档会有什么问题? 理想情况下,为所开发的服务编写接口文档,能提高与 ...
- spring boot / cloud (六) 开启CORS跨域访问
spring boot / cloud (六) 开启CORS跨域访问 前言 什么是CORS? Cross-origin resource sharing(跨域资源共享),是一个W3C标准,它允许你向一 ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- spring boot / cloud (十六) 分布式ID生成服务
spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...
- spring boot / cloud (十七) 快速搭建注册中心和配置中心
spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...
- spring boot / cloud (十八) 使用docker快速搭建本地环境
spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...
随机推荐
- 51nod_1122:机器人走方格 V4 (矩阵快速幂)
题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...
- Protobuf动态解析在Java中的应用 包含例子程序
最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程. Protocol Buffers是结构化数据格式标准,提供序列化和反序列方 ...
- Druid 详细介绍
文章来自阿里巴巴 Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource 高效可 ...
- 九度OJ1000
题目描述: 求整数a,b的和. 输入: 测试案例有多行,每行为a,b的值. 输出: 输出多行,对应a+b的结果. 样例输入: 1 2 4 5 6 9 样例输出: 3 9 15 代码实现: #inclu ...
- 项目中ApplicationContext
applicationContext说白了就是对beanFactory的扩展,也就是一个spring容器,而且applicationContext是单例的,项目中主要包含一个webApplicatio ...
- 文科生细谈学习Linux系统的重要性
首先大概介绍下自己,我学的是公共事业管理方面的专业,可以说是面向纯理论,社区管理社会管理的专业,但是从大二开始,对网络及服务器运维方面产生浓厚兴趣,并不断在网上找相关资料. 在这期间经历过很多,单说桌 ...
- ajax-jquery方法-初步入门01(整理)
-----------------------------------2017.07.21写----------------------------------------- 相比较原生javascr ...
- easyui项目问题集锦
1.级联问题(combobox) combobox至多可以保存2个东西value和text,但我需要第三个数的时候,怎么办?比如,省.市.区的三级级联,我选择市的时候,需要市id,市name,区号,邮 ...
- iOS设置圆角的常用方法
//第一种方法:最常用的方法,但是性能最差 UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100 ...
- Zabbix监控nginx性能
编辑nginx的配置文件nging #配置ngx_status location /nginx_status{ stub_status on; access_log off; } #重启nginx # ...