文档章节

spring boot / cloud (二) 规范响应格式以及统一异常处理

wangkang80
 wangkang80
发布于 2017/05/25 14:54
字数 635
阅读 1778
收藏 6

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());
  LOGGER.error(exception.getClass().getName(), exception);
  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

##结束

然后相关思路和原则,大家可自行搜索契约优先,由于本身不想在文章中引入太多教条性的东西,主要都是以解决问题的思路为主,所以不深入讨论.


想获得最快更新,请关注公众号

想获得最快更新,请关注公众号

© 著作权归作者所有

共有 人打赏支持
wangkang80
粉丝 361
博文 22
码字总数 34117
作品 3
浦东
高级程序员
私信 提问
加载中

评论(3)

wangkang80
wangkang80

引用来自“jackerx”的评论

统一处理错误和异常 用spring boot的ErrorController 更简单
可以看我的这两篇博客
https://my.oschina.net/wangkang80/blog/1519189
https://my.oschina.net/wangkang80/blog/1523308
jackerx
jackerx
统一处理错误和异常 用spring boot的ErrorController 更简单
小蚂蚁飞呀飞
66666666
UDF 集成样例--udf-sample

UDF 基于spring boot / spring cloud 的基础项目,脚手架,主要用于学习和实践 按照spring boot的思想,将各个不同的功能按照starter的形式拆分开来,做到灵活组合 物理架构示意 CI & CD 示意 代...

wangkang80
2017/08/27
344
0
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
06/06
0
0
Spring Boot全局异常处理

Spring Boot默认的异常处理机制 默认情况下,Spring Boot为两种情况提供了不同的响应方式。 一种是浏览器客户端请求一个不存在的页面或服务端处理发生异常时,一般情况下浏览器默认发送的请求...

狼王黄师傅
10/16
0
0
利用 Spring Boot 设计风格良好的Restful API及错误响应

一、前言 网上经常会看到一些文章,旨在介绍如何使用Spring MVC或Spring Boot实现Restful接口,譬如: 对于如上实现方式,本人着实不敢恭维。试问,这算哪门子的Restful?自认为其与Restful...

宅楠军
07/05
0
0
Spring Boot学习笔记-错误处理及自定义

正常的Web应用开发时,需要考虑到应用运行发生异常时或出现错误时如何来被处理,例如捕获必要的异常信息,记录日志方便日后排错,友好的用户响应输出等等。 当然应用发生错误,有可能是应用自...

chace0120
2015/12/31
3.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

&和&&,==和equals的区别

&和&& 相同点:都可以表示逻辑与(and),当运算符两边的结果都为true时,结果才为true,只要有一边为false,结果就为false。 不同点:&&还有短路的作用,即如果第一个表达式的结果为false,就...

森林之下
32分钟前
2
0
我和 Spring 大神的一天

摘要: 先介绍一下故事的5位主人公。 Josh Long 龙之春:Spring 技术布道师,撰写过5部著作,录制过3部畅销的培训视频,是一位开源软件贡献者。 Spencer Gibb:Spring 技术布道师,Spring Cl...

阿里云官方博客
34分钟前
2
0
【Zookeeper】源码分析目录(保存)

https://www.cnblogs.com/leesf456/p/6518040.html

Java搬砖工程师
38分钟前
2
0
vue-cli图片路径使用

https://www.cnblogs.com/minigrasshopper/p/8011630.html

LM_Mike
38分钟前
2
0
前方高能,重要通知!明珠不蒙尘,有才你就来。

11月开源众包服务之星计划--开发商招募正式开启了! 您还是否在为能接更多的订单而操碎了心? 开源众包即将迎来三周年华诞,重磅上线服务之星品牌计划。你有强大的技术实力?你有丰富的案例经...

开源中国众包平台
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部