首页 > 其他分享 >Spring Boot @RestControllerAdvice注解详解

Spring Boot @RestControllerAdvice注解详解

时间:2023-03-19 22:32:14浏览次数:33  
标签:处理 Spring 代码 Boot ResultBean RestControllerAdvice 异常 public

一、@RestControllerAdvice 注解的基础使用

我们先来看一下 @RestControllerAdvice 注解的基本使用方法。

在 Spring Boot 项目中,可以通过在类上添加 @RestControllerAdvice 注解来定义全局的异常处理类,如下所示:

@RestControllerAdvice
public class GlobalExceptionHandler {
    //处理所有异常
    @ExceptionHandler(Exception.class)
    public ResultBean exceptionHandler(Exception e) {
        return new ResultBean<>("0001", e.getMessage());
    }
}

在上述代码中,我们定义了一个名为 GlobalExceptionHandler 的异常处理类,并使用 @RestControllerAdvice 注解来标识该类为全局异常处理类。在该类中,我们使用 @ExceptionHandler 注解来指定该方法要处理的异常类型,在本例中是 Exception 类型的异常。当出现 Exception 类型的异常时,Spring Boot 会自动调用 exceptionHandler 方法来处理异常,并返回 ResultBean 类型的结果

二、@RestControllerAdvice 中的参数绑定

在实际开发中,我们经常需要在异常处理方法中获取一些请求参数,以便我们能够更好地处理异常。Spring Boot 可以通过将请求参数绑定到方法的参数上来轻松地实现这一点。

例如,我们需要获取请求中的 token 参数可以在异常处理方法中添加 @RequestParam 注解:

@RestControllerAdvice
public class GlobalExceptionHandler {
    //处理token过期异常
    @ExceptionHandler(TokenExpiredException.class)
    public ResultBean tokenExpiredExceptionHandler(TokenExpiredException e) {
        return new ResultBean<>("0002", "token过期,请重新登录");
    }
}

三、@RestControllerAdvice 中使用 AOP

在实际开发中,我们还可以结合 AOP 的思想,将异常处理代码从业务代码中分离出来,从而进一步提高程序的可维护性和可读性

我们来看一个简单的示例:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MyException.class)
    public ResultBean myExceptionHandler(MyException e) {
        return new ResultBean<>("0004", e.getMessage());
    }

    @Around("execution(public * com.example.demo.controller.*.*(..))")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        Object result = null;
        try {
            result = pjp.proceed();
        } catch (Exception e) {
            if (e instanceof MyException) {
                result = new ResultBean<>("0004", "自定义异常");
            } else {
                result = new ResultBean<>("0005", "未知异常");
            }
        }
        return result;
    }
}

在上述代码中,我们定义了一个环绕通知,在所有的 Controller 方法中,执行代码之前都会先执行该通知。在该通知中,我们可以通过调用 pjp.proceed() 执行被代理的方法,如果出现异常,则根据异常类型做出不同的处理。如果是 MyException 异常,则返回代码 "0004" 和异常信息,否则返回代码 "0005" 和默认错误信息。这样可以将异常处理从业务代码中分离出来,使得代码更加清晰和易于维护。

四、总结

全局异常捕获是一种处理系统中出现异常情况的机制,可以让我们更加准确地定位和解决系统中的问题。全局异常捕获的作用主要有以下几个方面:

统一错误处理:通过全局异常捕获机制,我们可以设置统一的异常处理方式,使得整个系统的异常信息输出样式、错误码等都保持一致,便于开发人员快速处理异常。

方便排查问题:通过统一的异常处理机制,我们可以将系统的异常信息全部写入日志文件,便于开发人员在出现问题的时候快速定位和排查问题。

提高代码可维护性:全局异常捕获可以减少代码冗余和重复,统一异常处理的方式和代码块可以让代码更易于维护。

提高系统的健壮性:通过全局异常捕获机制,我们可以处理大部分的可能出现的异常情况,并将系统的错误信息输出给用户。这样可以有效地提高系统的健壮性和可用性。

标签:处理,Spring,代码,Boot,ResultBean,RestControllerAdvice,异常,public
From: https://blog.51cto.com/learningfish/6131379

相关文章

  • 你能说出SpringBoot自动装配的原理吗
    SpringBoot目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。在过去,我们要让一个Spring项......
  • SpringBoot+Vue+EasyExcel实现excel简单导入导出
    1.先导入EasyExcel依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.......
  • Spring的Controller是单例还是多例,怎么保证并发的安全
    controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。如何保证并发的安全?不要在controller中定义成员变量。......
  • day07-SpringBoot接收参数相关注解
    SpringBoot接收参数相关注解1.基本介绍SpringBoot接收客户端提交数据/参数会使用到相关注解详解@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@Co......
  • nacos原理(一)Springcloud 配置中心接入原理&客户端拉取配置原理
    ​ 之前已经了解到Springcloud环境对bootstrap.yml加载的原理,也就是加载bootstrap的时机比较靠前。接下来简单研究下Springcloud环境中配置中心的加载以及动态更新原理。......
  • nacos原理(二)更新Spring容器对象
    Spring容器感知分为两部分。第一部分是更新Environment、第二部分是注册到Spring容器的对象感知。1.更新Environment上文知道对于配置发生改变会调用发送newRefres......
  • 硬核26000字分析uboot启动过程
    更好的阅读体验请见:​​硬核26000字分析uboot启动过程​​汇编阶段最先执行的是汇编文件start.S,这个文件跟架构有关,例如芯片架构是arm926ejs,那路径就在​​arch/arm/cpu/sta......
  • 不使用spring boot等框架搭建servlet
    使用JavaSE搭建javaweb项目访问数据库,比并将数据库的内容打印到浏览器页面上。只用javaSE,tomcat,jdbc工具jdk1.8tomcat8.5MySQL5.7mysqljar5.1.48第一步:创建空......
  • SpringBoot集成Swagger错误总结
    错误展示rorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.2023-03-1915:37:55.307ERROR12980---......
  • Spring三级缓存与解决循环依赖
    一、什么是循环依赖、一级缓存A、B两个Service相互依赖,类似于死锁,我们来看AServiceBean的生命周期  我们要填充bService时,在单例池找不到B,就会先去创建B。但是创建B......