后端返回结果封装以及自定义异常

后端返回结果封装以及自定义异常

后端通常要给前段一个统一的返回结果的形式,通常包含一下内容

  • 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的同一结构,方面前段针对不同的情况处理
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值