1.状态码定义
根据需求分析阶段可以预见的问题提前做出定义(对执行业务处理逻辑过程中可能出现的成功和失败状态做出的针对性描述),用枚举定义状态码,先定义一部分,业务中遇到新的问题再添加即可。
(1)在com.xiang.forum.common包下创建枚举类型命名为ResultCode
(2)分析状态码应该返回的值
状态码
返回值
(3)提供对应的构造方法、get方法及toString()方法
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
return "返回的状态码相关信息{" +
"code=" + code +
", message='" + message + '\'' +
'}';
}
(4)开始写不同状态码下的返回值信息
这里要注意的是枚举类型调用构造方法时候需要用 ; 结尾,每个调用方法之间用 , 隔开。
SUCCESS(0,"操作成功"),
FAILED(1000,"操作失败"),
FAILED_UNAUTHORIZED(1001,"未授权"),
FAILED_PARAMS_VALIDATE(1002,"参数校验失败"),
FAILED_FORBIDDEN(1003,"禁止访问"),
FAILED_CREATE(1004,"新增失败"),
FAILED_NOT_EXISTS(1005,"资源不存在"),
FAILED_USER_EXISTS(1101,"用户已存在"),
FAILED_USER_NOT_EXISTS(1102,"用户不存在"),
FAILED_LOGIN(1103,"用户名或密码错误"),
FAILED_USER_BANNED(1104,"您已被禁言,请联系管理员,并重新登录"),
FAILED_TWO_PWD_NOT_SAME(1105,"两次输入的密码不一致"),
ERROR_SERVICES(2000,"服务器内部错误"),
ERROR_IS_NULL(2001,"IS NULL")
;
2.返回结果定义
系统实现前后端分离,统一返回JSON格式的字符串,需要定义一个类,包含状态码,描述信息,及返回的结果数据
例如:以一个用户登录查看信息
(1)在com.xiang.forum.common包下创建AppResult类
(2)该类的话设置为一个泛型,让它在编译时就被编译成Object类型,定义相关的属性信息
(3)提供构造方法及get、set方法
构造方法可以返回
状态码+错误信息
状态码+错误信息+返回的数据结果集
public AppResult(int code, String message) {
this(code,message,null);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public AppResult(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
(4)定义成功的方法返回
/**
* 成功返回
*/
public static AppResult success() {
return new AppResult(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage());
}
public static AppResult success(String message) {
return new AppResult(ResultCode.SUCCESS.getCode(), message);
}
public static <T> AppResult<T> success(T data) {
return new AppResult<>(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),data);
}
public static <T> AppResult<T> success(String message, T data) {
return new AppResult<>(ResultCode.SUCCESS.getCode(),message,data);
}
(5)定义失败的方法返回
/**
* 失败返回
*/
public static AppResult failed() {
return new AppResult(ResultCode.FAILED.getCode(),ResultCode.FAILED.getMessage());
}
public static AppResult failed(String message) {
return new AppResult(ResultCode.FAILED.getCode(),message);
}
public static AppResult failed(ResultCode resultCode) {
return new AppResult(resultCode.getCode(), resultCode.getMessage());
}
3.自定义异常
创建一个异常类,加入状态码与状态信息属性,在我们自己写业务代码里,对于可预见的异常都抛出自定义的异常,可以为异常设置一个定义好的错误。
(1)在com.xiang.forum.exception包下创建ApplicationException
(2)继承运行时异常类,并自定义异常
(3)提供构造方法
public ApplicationException (AppResult errorResult) {
super(errorResult.getMessage());
this.errorResult = errorResult;
}
4.全局异常处理
使用@ControllerAdvice + @ExceptionHandler注解实现统一异常处理(@ControllerAdvice表示控制器通知类)
(1)在com.xiang.forum.exception包下创建GlobalExceptionHandler类
(2)添加注解
(3)实现异常方法
@ResponseBody
@ExceptionHandler(ApplicationException.class) //具体要处理那个类异常
public AppResult applicationExceptionHandler (ApplicationException e) {
// 打印异常信息
//开始生产之前要删除
e.printStackTrace();
// 打印日志
log.error(e.getMessage());
if(e.getErrorResult() != null) {
return e.getErrorResult();
}
// 返回具体的异常信息
if(e.getMessage() == null || e.getMessage().equals("")) {
return AppResult.failed(ResultCode.ERROR_SERVICES);
}
return AppResult.failed(e.getMessage());
}
// 自定义异常不能处理的方法
@ResponseBody
@ExceptionHandler(Exception.class)
public AppResult exceptionHandler(Exception e) {
// 打印异常信息
e.printStackTrace();
// 打印日志
log.error(e.getMessage());
if(e.getMessage() == null || e.getMessage().equals("")) {
return AppResult.failed(ResultCode.ERROR_SERVICES);
}
return AppResult.failed(e.getMessage());
}
(4)测试异常
在TestController中添加以下方法
@GetMapping("/exception")
public AppResult testException() throws Exception {
throw new Exception("这是一个Exception");
}
@GetMapping("/appexception")
public AppResult testApplicationException() {
throw new ApplicationException("这是一个ApplicationException");
}
exception测试结果:
appexception测试结果:
公共处理基本完成,还有一部分公共处理是API接口自动生成和一些工具类的处理,转下一篇公共代码开发二。