SpringBoot&SpringMVC统一异常处理之RestControllerAdvice

文档说明

开发步骤

我们接着上面这个项目继续,先来看看表的SQL,其中用户名和密码不能为空,但是我们发送这样一个请求

-- 用户表
CREATE TABLE `user` (
    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID',
    `username` VARCHAR(20) NOT NULL COMMENT '用户名',
    `password` VARCHAR(20) NOT NULL COMMENT '密码',
    `birthday` DATE COMMENT '出生日期'
);

接收请求的Controller如下

@PostMapping
public R add(@RequestBody User user);

请求:

添加用户的请求

请求体:

{"username": "XiaoHH", "birthday": "1996-02-10"}

可以发现密码是为空的,那么后端的返回就是:

用户密码没写报错

然后前端一脸懵逼直接说后端技术不行,今天就教你怎么解决这类问题,无需导入多余jar包,新建一个异常处理类 HandleControllerAdvice

package com.xiaohh.user.exceptions.advices;

import com.xiaohh.user.constants.BizCodeEnum;
import com.xiaohh.user.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * <p>
 * 前端统一的异常处理类
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-03-04 星期四 20:17:18
 * @file HandleControllerAdvice.java
 */
@Slf4j // 导入日志
@RestControllerAdvice(basePackages = {"com.xiaohh.user.controllers"})  // 标注这是一个统一的异常处理类
public class HandleControllerAdvice {

    /**
     * 处理所有异常的异常处理类
     *
     * @param t 异常对象
     * @return 返回处理结果
     */
    @ExceptionHandler(value = Throwable.class)
    public R handleThrowable(Throwable t) {
        // 记录一下日志
        log.error(BizCodeEnum.UNKNOWN_EXCEPTION.getMessage(), t);
        return R.error(BizCodeEnum.UNKNOWN_EXCEPTION);
    }
}

其中 BizCodeEnum 为一个枚举类型,类型中可以统一声明异常字符串和错误码:

package com.xiaohh.user.constants;

/**
 * <p>
 * 异常统一声明
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-02-22 星期一 20:03:50
 * @file BizCodeEnum.java
 */
public enum BizCodeEnum {

    /**
     * 未知异常
     */
    UNKNOWN_EXCEPTION(10000, "系统未知异常"),

    /**
     * 参数校验异常
     */
    VALIDATE_EXCEPTION(10001, "参数格式校验失败"),

    /**
     * 数据完整性异常
     */
    DATA_INTEGRITY_VIOLATION_EXCEPTION(10002, "数据完整性校验失败"),

    /**
     * SQL 语句错误
     */
    BAD_SQL_GRAMMAR_EXCEPTION(10003, "SQL 语句错误");

    /**
     * 错误码
     */
    private int code;

    /**
     * 错误信息
     */
    private String message;

    /**
     * @param code    错误码
     * @param message 错误信息
     */
    BizCodeEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 获取错误码
     *
     * @return 错误码
     */
    public int getCode() {
        return code;
    }

    /**
     * 获取错误信息
     *
     * @return 错误信息
     */
    public String getMessage() {
        return message;
    }
}

可以看到我们抛出了系统未知异常,错误码为 10000,接下来我们继续发送请求测试:

系统未知异常

可以发现已经处理了,处理 Throwable 可以处理所有的异常,但是不大准确,我们可以看到所抛出的异常为:DataIntegrityViolationException

DataIntegrityViolationException异常

我们建立一个处理这个异常的处理器:

/**
 * 处理数据完整性异常
 * @param e 异常对象
 * @return 返回结果
 */
@ExceptionHandler(value = DataIntegrityViolationException.class)
public R handleDataIntegrityViolationException(DataIntegrityViolationException e) {
    log.error(BizCodeEnum.DATA_INTEGRITY_VIOLATION_EXCEPTION.getMessage(), e);
    return R.error(BizCodeEnum.DATA_INTEGRITY_VIOLATION_EXCEPTION);
}

我们再次测试:

数据完整性异常

好啦,那么我们现在错误定位就精准了,如果还有什么异常唱着上面写,没得问题的,下课。

代码已经同步到 git 仓库了哦

精彩预告(更新预告)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值