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 仓库了哦

精彩预告(更新预告)

相关文章
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
355 3
|
9月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
548 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
860 0
|
9月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
546 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
475 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
400 0
|
缓存 前端开发 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版)
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
3573 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
373 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例