Spring-自定义异常及全局异常处理@RestControllerAdvice

前言

开发中,经常需要对业务异常进行处理;而往往业务中会出现很多种情况需要进行业务处理,例如查询人员数据为空、人员角色不符、人员收货地址不存在等等,都需要try catch进行不同的处理。这样的try catch会造成大量的重复代码,此时就需要全局异常捕获@RestControllerAdvice,通过它来构建一个全局捕获根据不同的异常类型来进行统一的处理。

1、构建自定义业务异常-BusinessException

复制代码
public class BusinessException extends RuntimeException {

    private Integer code;

    private String message;

    public BusinessException(Integer code, String message) {
        super();
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

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

    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、创建全局统一异常处理

复制代码
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
	// 统一处理业务异常-BusinessException
    @ExceptionHandler(value = BusinessException.class)
    public NormalResponse businessException(HttpServletRequest request,BusinessException e){
        log.error("{}请求异常{}",request.getRequestURL(),e.getMessage());
        return NormalResponse.fail(e.getMessage());
    }
  }

3、在业务中使用

复制代码
    public void testGlobalException() {
        // 业务处理...
        Student student = studentMapper.selectById(10086);
        if (Objects.isNull(student)) {
            throw new BusinessException(20001, "查询人员不存在");
        }
        // 正常逻辑处理...
    }

假设我们在业务处理中,需要查询id=10086的学生,然后对这个学生的信息进行处理(更新,添加字段等),当查询人员不存在时,需要提醒接口调用方出现了业务问题-查询人员不存在。

4、演示结果

复制代码
控制台日志:
2024-09-10 15:48:15.893 ERROR 51752 --- [nio-6024-exec-3] c.s.d.exception.GlobalExceptionHandler   : http://localhost:6024/test/global-exception请求异常查询人员不存在
15:48:15.893 [http-nio-6024-exec-3] ERROR c.s.d.e.GlobalExceptionHandler - http://localhost:6024/test/global-exception请求异常查询人员不存在

postman接口返参:
{
    "code": -1,
    "message": null,
    "data": "查询人员不存在"
}
相关推荐
小许学java9 分钟前
Spring AI快速入门以及项目的创建
java·开发语言·人工智能·后端·spring·ai编程·spring ai
kfepiza2 小时前
Spring 如何解决循环依赖 笔记251008
java·spring boot·spring
kfepiza3 小时前
Spring的三级缓存原理 笔记251008
笔记·spring·缓存
popoxf13 小时前
spring容器启动流程(反射视角)
java·后端·spring
谷哥的小弟14 小时前
Spring Framework源码解析——ApplicationContextAware
spring·源码
武子康14 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
珹洺15 小时前
Java-Spring入门指南(十五)SpringMVC注解开发
java·spring·microsoft
半旧夜夏16 小时前
【Spring】AOP的核心原理配方
java·spring
MX_935920 小时前
SpringBoot项目优先级以及bean的管理
java·spring boot·后端·spring
_extraordinary_1 天前
Java SpringBoot(一)--- 下载Spring相关插件,创建一个Spring项目,创建项目出现的问题
java·spring boot·spring