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

代码仓库 (博客配套代码)

结束

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


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

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

posted @ 2017-08-27 23:48  obejct-itkk  阅读(3185)  评论(0编辑  收藏  举报