SpringMVC之统一返回结果和统一异常处理

目录

统一返回结果

统一异常处理

业务异常类:BusException

全局异常统一处理类:GlobalExceptionHandle

示例:


统一返回结果

所有的接口均返回 ResultDto 类型的数据,ResultDto 类的代码如下,主要有 4 个字段

  • success:表示接口是成功还是失败

  • code:错误码,当有异常的时候,可以返回具体的错误码

  • msg:提示信息,比如:操作成功、用户名有误、密码有误等等

  • data:类型是一个泛型,表示任意类型,这个用来存放接口中具体返回的数据,可以是任意类型的对象

  • 还提供了几个静态方法,方便创建 ResultDto 对象

/**
 * rest接口通用返回值数据结构
 *
 * @param <T>
 */
public class ResultDto<T> {
    //接口状态(成功还是失败)
    private Boolean success;
    //错误码
    private String code;
    //提示信息
    private String msg;
    //数据
    private T data;

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static <T> ResultDto<T> success(T data) {
        return success(data, "操作成功!");
    }

    public static <T> ResultDto<T> success(T data, String msg) {
        ResultDto<T> result = new ResultDto<>();
        result.setSuccess(Boolean.TRUE);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    public static <T> ResultDto<T> error(String msg) {
        return error(null,msg);
    }
    public static <T> ResultDto<T> error(String code,String msg) {
       return error(code,msg,null);
    }
    public static <T> ResultDto<T> error(String code, String msg, T data) {
        ResultDto<T> result = new ResultDto<>();
        result.setSuccess(Boolean.FALSE);
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
}

统一异常处理

异常处理这块,我们的设计主要有 2 点,通过这 2 点来解决异常处理的问题

  • 第一点:定义一个基础的业务异常类(BusException),业务代码中手动抛出异常的时候,统一抛出这种类型的异常,异常类型中可以携带更详细的错误信息,比如错误码、提示信息、扩展数据等等

  • 第 2 点:采用 springmvc 全局来处理异常,控制器中不要捕获异常,将一次交给 springmvc 框架来统一处理。

业务异常类:BusException

代码比较简单,主要有 2 个属性和几个静态方法

  • code:异常错误码,最终会丢给 ResultDto 的 code 属性输出到客户端

  • data:异常的时候,可以传递一些扩展信息,此时可以丢到 data 中,最终会丢给 ResultDto 的 data 属性输出到客户端

  • 提供了几个静态方法,便于抛出 BusException 异常

  • 当我们的业务代码中需要抛出异常的时候,要求均抛出 BusException 类型的异常

/**
 * 业务异常
 */
public class BusException extends RuntimeException {
    //异常错误码
    private String code;
    //错误扩展信息
    private Object data;

    public BusException(String msg) {
        this(null, msg);
    }

    public BusException(String code, String msg) {
        this(code, msg, null);
    }

    public BusException(String code, String msg, Object data) {
        super(msg);
        this.code = code;
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public static void throwBusException(String msg) {
        throwBusException(null, msg);
    }

    public static void throwBusException(String code, String msg) {
        throwBusException(code, msg, null);
    }

    public static void throwBusException(String code, String msg, Object data) {
        throw new BusException(code, msg, data);
    }
}

全局异常统一处理类:GlobalExceptionHandle

如下代码,大家对 springmvc 统一异常处理不了解,建议先看一下上一篇文章。

注意下面代码中的@1,这里使用到了@RestControllerAdvice,他和@ControllerAdvice 功能类似,只是这个注解内部定义的时候上面多了一个@ResponseBody 注解,表示下面这个类中处理异常的方法返回值最终都会以 json 格式输出到客户端

/**
 * 全局异常处理
 */
@RestControllerAdvice // @1
public class GlobalExceptionHandle {
    /**
     * 统一处理业务异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler(BusException.class)
    public <T> ResultDto<T> doBusException(BusException e) {
        //1、记录错误日志
        //2、返回结果
        return ResultDto.error(e.getCode(), e.getMessage(), (T) e.getData());
    }

    /**
     * 处理其他异常
     *
     * @param e
     * @param <T>
     * @return
     */
    @ExceptionHandler
    public <T> ResultDto<T> doException(Exception e) {
        //1、记录错误日志
        //2、返回结果
        return ResultDto.error("系统异常,请联系管理员,错误详情:" + e.getMessage());
    }
}

示例:

如下代码,注意两点信息

  • 内部提供了 2 个接口,接口的返回值都是 ResultDto 类型的

  • 代码中,没有了 try catch,而是将异常类型封装为 BusException 类型抛出,比如验证码有误,会抛出了 BusException,顺便携带了错误码和错误提示信息,这些都会通过全局异常的处理,输出到客户端

@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * 获取用户id
     *
     * @param code
     * @return
     */
    @RequestMapping("/getUserName")
    public ResultDto<String> getUserName(@RequestParam("code") Integer code) {
        if (!Integer.valueOf(6666).equals(code)) {
            //验证码有误的时候,返回4001错误码
            BusException.throwBusException("4001", "验证码有误!");
        }
        return ResultDto.success("路人");
    }

    /**
     * 获取用户id
     *
     * @param code
     * @return
     */
    @RequestMapping("/getUserId")
    public ResultDto<String> getUserId(@RequestParam("code") Integer code) {
        if (!Integer.valueOf(6666).equals(code)) {
            BusException.throwBusException("4001", "验证码有误!");
        }
        return ResultDto.success("8888");
    }

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值