后端返回结果封装以及自定义异常
后端通常要给前段一个统一的返回结果的形式,通常包含一下内容
- code 响应状态码
- message 相应信息
- data 相应数据
Java代码如下
@Data
@Schema(description = "响应结果实体类") // swagger注解,不需要可删除
public class Result<T> {
//返回码
@Schema(description = "业务状态码") // swagger注解,不需要可删除
private Integer code;
//返回消息
@Schema(description = "响应消息")
private String message;
//返回数据
@Schema(description = "业务数据")
private T data;
// 私有化构造
private Result() {}
// 返回数据
public static <T> Result<T> build(T body, Integer code, String message) {
Result<T> result = new Result<>();
result.setData(body);
result.setCode(code);
result.setMessage(message);
return result;
}
// 通过枚举构造Result对象
public static <T> Result build(T body , ResultCodeEnum resultCodeEnum) {
return build(body , resultCodeEnum.getCode() , resultCodeEnum.getMessage()) ;
}
}
通常返回data 、code、message,并且code和message一般相对应,可以通过枚举类封装,如下。
@Getter // 提供获取属性值的getter方法
public enum ResultCodeEnum {
SUCCESS(200 , "操作成功") ,
LOGIN_ERROR(201 , "用户名或者密码错误"),
VALIDATECODE_ERROR(202 , "验证码错误") ,
LOGIN_AUTH(208 , "用户未登录"),
USER_NAME_IS_EXISTS(209 , "用户名已经存在"),
SYSTEM_ERROR(9999 , "您的网络有问题请稍后重试"),
NODE_ERROR( 217, "该节点下有子节点,不可以删除"),
DATA_ERROR(204, "数据异常"),
ACCOUNT_STOP( 216, "账号已停用"),
STOCK_LESS( 219, "库存不足"),
;
private Integer code ; // 业务状态码
private String message ; // 响应消息
private ResultCodeEnum(Integer code , String message) {
this.code = code ;
this.message = message ;
}
}
返回数据就可以通过如下格式
return Result.build(null,ResultCodeEnum.SUCCESS); // null 可以替换成你自己真实返回的数据
在真实场景中我们只能返回正常信息,在捕捉到异常之后才能返回到异常信息,可以自定义异常实现result返回,方便前段处理
自定义异常
@Data
public class MyException extends RuntimeException{
// 异常状态码
private Integer code;
// 异常信息
private String message;
// 使用的是上面的枚举类实现
private ResultCodeEnum resultCodeEnum;
public MyException(ResultCodeEnum resultCodeEnum){
this.resultCodeEnum = resultCodeEnum;
this.code = resultCodeEnum.getCode();
this.message = resultCodeEnum.getMessage();
}
}
定一个全局异常处理器
// 给controller增加统一操作中处理
@ControllerAdvice
public class GlobalExceptionHandler {
// 全局异常的时候执行
@ExceptionHandler(Exception.class)
@ResponseBody // 返回的结果是json格式
public Result error(Exception e) {
e.printStackTrace();
return Result.build(null, ResultCodeEnum.SYSTEM_ERROR);
}
// 自定义异常的时候执行
@ExceptionHandler(MyException.class)
@ResponseBody // 返回的结果是json格式
public Result error(MyException e) {
return Result.build(null, e.getResultCodeEnum());
}
}
在捕捉异常抛出的形式
throw new MyException(ResultCodeEnum.LOGIN_AUTH);
// 此时就算程序出现异常也给前段返回的是Result的同一结构,方面前段针对不同的情况处理