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 (二) 规范响应格式以及统一异常处理的更多相关文章

  1. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

    spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...

  2. spring boot / cloud (十二) 异常统一处理进阶

    spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...

  3. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  4. spring boot / cloud (三) 集成springfox-swagger2构建在线API文档

    spring boot / cloud (三) 集成springfox-swagger2构建在线API文档 前言 不能同步更新API文档会有什么问题? 理想情况下,为所开发的服务编写接口文档,能提高与 ...

  5. spring boot / cloud (六) 开启CORS跨域访问

    spring boot / cloud (六) 开启CORS跨域访问 前言 什么是CORS? Cross-origin resource sharing(跨域资源共享),是一个W3C标准,它允许你向一 ...

  6. spring boot / cloud (八) 使用RestTemplate来构建远程调用服务

    spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...

  7. spring boot / cloud (十六) 分布式ID生成服务

    spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...

  8. spring boot / cloud (十七) 快速搭建注册中心和配置中心

    spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...

  9. spring boot / cloud (十八) 使用docker快速搭建本地环境

    spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...

随机推荐

  1. kali切换字符界面模式和切换图形界面模式

    我也是走了很多弯路,下面把正确的命令写出来,网上的不是说不正确,是linux命令做出了更改 Systemd是一种新的linux系统服务管理器 它替代了init, 直接上命令吧! 切换至字符界面 sud ...

  2. 深入理解javascript异步编程障眼法&&h5 web worker实现多线程

    0.从一道题说起 var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end'); 1 2 3 4 ...

  3. jvm005 从jvm的角度谈谈线程的实现

    一.线程的实现 在谈谈线程之前,我们要先知道线程是何物?在学习操作系统时,我们得知进程和线程的概念,接下来我们将开始揭示线程. 什么是进程?通过任务管理器我们就看到了进程的存在.而通过观察,我们发现只 ...

  4. PHP中json_encode与json_decode

    一.json_encode() 对变量进行JSON编码, 语法: json_encode ( $value [, $options = 0 ] ) 注意:1.$value为要编码的值,且该函数只对UT ...

  5. 如何制作一个完美的全屏视频H5

    写在前面的话: 最近一波H5广告火爆整个互联网圈,身为圈内人,我们怎能     不! 知!道! :( 嘘!真不知道的也继续看下去,有收获 ↓ ) So,搞懂这个并不难. 这篇文章将带你从头到尾了解H5 ...

  6. (转)Java线程:新特征-条件变量

    Java线程:新特征-条件变量   条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量.但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往 ...

  7. 学习笔记TF032:实现Google Inception Net

    Google Inception Net,ILSVRC 2014比赛第一名.控制计算量.参数量,分类性能非常好.V1,top-5错误率6.67%,22层,15亿次浮点运算,500万参数(AlexNet ...

  8. Python+Selenium+webdriver环境搭建(windows)以及相关资源下载链接

    今天记录一下测试小菜鸟alter在测试入门的一点关于python+Selenium+webdriver环境搭建的经历以及资源分享.欢迎交流学习,批评指正. 一.Python的下载与安装 1.pytho ...

  9. bash中(),{},(()),[],[[]]的区别

    前言:在bash中遇到各种括号,同时在进行字符数值比较判定时,总是不断出现问题,于是通过参考<advanced bash-scripting guide>,同时在centos 6.7版本上 ...

  10. 灵玖软件NLPIRParser智能文本聚类

    随着互联网的迅猛发展,信息的爆炸式增加,信息超载问题变的越来越严重,信息的更新率也越来越高,用户在信息海洋里查找信息就像大海捞针一样.搜索引擎服务应运而生,在一定程度上满足了用户查找信息的需要.然而互 ...