SpringBoot&SpringMVC统一异常处理之RestControllerAdvice

简介: 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"}
• 1

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

然后前端一脸懵逼直接说后端技术不行,今天就教你怎么解决这类问题,无需导入多余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

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

/**
 * 处理数据完整性异常
 * @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 仓库了哦

精彩预告(更新预告)

相关文章
|
6月前
|
JSON 前端开发 Java
SpringBoot:SpringMVC(上)
SpringBoot:SpringMVC(上)
48 3
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
93 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
1月前
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
51 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
3月前
|
前端开发 Java Spring
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
58 0
|
5月前
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
51 1
|
5月前
|
Java 程序员
浅浅纪念花一个月完成Springboot+Mybatis+Springmvc+Vue2+elementUI的前后端交互入门项目
浅浅纪念花一个月完成Springboot+Mybatis+Springmvc+Vue2+elementUI的前后端交互入门项目
50 1
|
5月前
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库
|
4月前
|
XML 前端开发 Java
Spring Boot与Spring MVC的区别和联系
Spring Boot与Spring MVC的区别和联系
|
4月前
|
Java
springboot全局异常处理BasicErrorController和RestControllerAdvice
springboot全局异常处理BasicErrorController和RestControllerAdvice