Spring Boot中全局异常处理器

文章目录

      • [1.Spring Boot中两种异常处理方式](#1.Spring Boot中两种异常处理方式)
      • 2.为什么需要全局异常处理呢?
      • [3. 全局异常处理器](#3. 全局异常处理器)
      • 测试
      • [4.@ControllerAdvice 详解](#4.@ControllerAdvice 详解)
      • [5.@ExceptionHandler 详解](#5.@ExceptionHandler 详解)

1.Spring Boot中两种异常处理方式

要想解决测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

A. 在方法中加入 try...catch 进行异常捕获

形式如下:

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在其他方法中加上try...catch进行处理,代码冗余,不通用。

B. 使用异常处理器进行全局异常捕获

采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

2.为什么需要全局异常处理呢?

  1. 统一异常处理:全局异常处理器可以集中处理应用程序中的所有异常,避免在每个控制器或服务方法中都编写异常处理逻辑。这样可以减少代码冗余,提高代码的可维护性和可读性。
  2. 提高代码可靠性:通过全局异常处理,可以确保应用程序在发生异常时能够做出合适的响应,如返回友好的错误信息或页面,而不会因为异常而导致系统崩溃或提供错误的响应。
  3. 增强安全性:全局异常处理可以捕获并处理应用程序中的异常,防止恶意用户通过异常信息获取系统敏感信息或进行其他攻击。
  4. 提升用户体验:通过友好的错误信息或页面,向用户提供清晰的提示和指导,帮助用户更好地理解发生的问题,并提供解决方案,从而提升用户体验。
  5. 方便日志记录:全局异常处理器通常会记录异常信息,包括异常类型、发生时间、堆栈轨迹等,这些信息对于排查和解决问题非常有用。通过日志记录,可以及时发现并定位应用程序中的问题,提高系统的稳定性和可靠性。

3. 全局异常处理器

在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。

异常处理方法逻辑:

  • 指定捕获的异常类型为 SQLIntegrityConstraintViolationException
  • 解析异常的提示信息, 获取出是那个值违背了唯一约束
  • 组装错误信息并返回
java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class  GlobalExceptionHandler {

    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        log.error(ex.getMessage());
        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }
        return R.error("未知错误");
    }
}

代码说明:

​ 上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:

@ControllerAdvice : 指定拦截那些类型的控制器;

@ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;

annotations属性指定只对带有@RestController或@Controller注解的类中的方法进行异常处理。

@ExceptionHandler(SQLIntegrityConstraintViolationException.class):使用@ExceptionHandler注解标识这是一个异常处理方法,处理SQLIntegrityConstraintViolationException异常。

测试

全局异常处理器编写完毕之后,我们需要将项目重启, 完毕之后直接访问管理系统首页, 点击 "员工管理" 页面中的 "添加员工" 按钮。当我们在测试中,添加用户时, 输入了一个已存在的用户名时,前端界面出现如下错误提示信息:

4.@ControllerAdvice 详解

  1. 作用范围
    • @ControllerAdvice 注解可以用于类级别,用于标记一个类为全局异常处理器。
    • 它也可以与 @RestController@Controller 注解一起使用,用于指定全局异常处理器只处理带有 @RestController@Controller 注解的控制器类中抛出的异常。
  2. 异常处理
    • 通过在 @ControllerAdvice 注解标记的类中定义异常处理方法,可以统一处理应用程序中的各种异常。
    • 异常处理方法需要使用 @ExceptionHandler 注解进行标记,以指定处理的异常类型。
  3. 作用域
    • @ControllerAdvice 注解可以限定作用的范围,即指定哪些控制器类的异常会被当前的全局异常处理器处理。
    • 可以通过 annotationsbasePackagesbasePackageClasses 等属性来指定作用的范围。
  4. 其他用途
    • 除了处理异常之外,@ControllerAdvice 还可以用于其他方面,比如全局数据绑定、全局数据预处理等。

5.@ExceptionHandler 详解

  1. 用法
    • @ExceptionHandler 注解可以用于方法级别,用于标记一个方法为异常处理方法。
    • 异常处理方法需要定义在控制器类中,并且可以有任意的访问修饰符。
  2. 参数
    • 异常处理方法的参数可以是异常类型,也可以是其他类型的参数。
    • 如果异常处理方法的参数是异常类型,则该方法只会处理指定类型的异常。
    • 如果异常处理方法的参数是其他类型的参数,则该方法会处理所有类型的异常,并且异常对象会作为参数传递给方法。
  3. 异常处理逻辑
    • 异常处理方法可以编写任意的异常处理逻辑,比如记录日志、返回错误信息、执行特定的补救措施等。
    • 在方法中可以通过异常对象来获取异常信息,如异常消息、堆栈轨迹等。
  4. 多个异常处理方法
    • 一个控制器类可以有多个异常处理方法,用来处理不同类型的异常。
    • 当多个异常处理方法都能处理同一类型的异常时,Spring 框架会选择最匹配的异常处理方法来处理异常。

总的来说,@ExceptionHandler 注解提供了一种在控制器中处理异常的机制,能够根据不同类型的异常来执行不同的异常处理逻辑,使代码更加清晰和易于维护。

相关推荐
cfm_29147 分钟前
SpringBoot启动原理
java·spring boot·spring
漫随流水1 小时前
Java——springboot web案例
java·开发语言·spring boot
从此以后自律1 小时前
Java Object 类常用方法全讲解
java·开发语言
念何架构之路1 小时前
Docker 容器状态机 学习
java·学习·docker
你有我备注吗1 小时前
SQL学习之查询
java·sql·学习
xixi09242 小时前
JMeter5.6.3基础使用教程1
java·开发语言
带刺的坐椅2 小时前
用 Solon ReActAgent 落地发票识别与智能报销
java·llm·solon·react-agent
罗超驿2 小时前
15.Java异常处理:从束手无策到从容应对
java·开发语言
半夜修仙2 小时前
RabbitMQ的推模式和拉模式
java·分布式·中间件·rabbitmq·github·java-rabbitmq
掉鱼的猫2 小时前
用 Solon ReActAgent 落地发票识别与智能报销
java·llm·agent