SpringBoot中的@RestControllerAdvice注解详解

 更新时间:2024年01月16日 09:34:12   作者:加油当当  
这篇文章主要介绍了SpringBoot中的@RestControllerAdvice注解详解,RestControllerAdvice注解用于创建全局异常处理类,用于捕获和处理整个应用程序中的异常,需要的朋友可以参考下

1. @RestControllerAdvice注解详解

1.1 概述

@RestControllerAdvice注解是Spring MVC和Spring Boot应用程序中用于定义全局异常处理类的注解,它是@ControllerAdvice注解的特殊版本,用于RESTful风格的应用程序。

@RestControllerAdvice可以捕获整个应用程序中抛出的异常,并对它们进行处理。这样可以实现在整个应用程序范围内统一处理异常的目标;

@RestControllerAdvice注解实际上是@ControllerAdvice和@ResponseBody注解的组合。这意味着,当你使用@RestControllerAdvice注解时,异常处理方法的返回值将自动转换为HTTP响应的主体;

1.2 用途

@RestControllerAdvice注解用于创建全局异常处理类,用于捕获和处理整个应用程序中的异常。它适用于RESTful风格的应用程序,因为它自动将异常处理方法的返回值转换为HTTP响应的主体。

1.3 基本使用

要使用@RestControllerAdvice注解,只需在类上添加该注解。这个类应包含一个或多个带有@ExceptionHandler注解的方法,用于处理不同类型的异常。

例如:

@RestControllerAdvice
public class GlobalRestExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}

1.4 属性

@RestControllerAdvice注解继承了@ControllerAdvice注解的属性:

annotations:

用于指定需要扫描的其他注解。只有带有这些注解的类中的异常处理方法才会被全局异常处理类处理。

basePackages:

别名:value

用于指定需要扫描的包名。只有这些包下的类中的异常处理方法才会被全局异常处理类处理。

value:

是默认的属性;

用于指定要处理的异常类型。如果没有指定value属性,则默认处理所有的异常类型;

basePackageClasses:

用于指定需要扫描的类。只有这些类中的异常处理方法才会被全局异常处理类处理。

assignableTypes:

用于指定需要扫描的类或接口。只有这些类或接口的实现类中的异常处理方法才会被全局异常处理类处理。

这些属性可以帮助你限制全局异常处理类的作用范围,使其只处理特定包、类或接口下的异常。

1.5 与@ExceptionHandler的结合

@RestControllerAdvice通常与@ExceptionHandler注解一起使用。在全局异常处理类中,你可以定义多个带有@ExceptionHandler注解的方法,用于处理不同类型的异常。当指定类型的异常在整个应用程序中抛出时,相应的`@ExceptionHandler方法将被调用以处理该异常。由于@RestControllerAdvice注解自动将异常处理方法的返回值转换为HTTP响应的主体,因此,你无需使用@ResponseBody`注解。

例如:

@RestControllerAdvice
public class GlobalRestExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An unexpected error occurred: " + ex.getMessage());
    }
}

在上面的代码中,我们定义了一个全局RESTful异常处理类,并处理了三种类型的异常:UserNotFoundException、IllegalArgumentException和Exception。对于每种异常,我们分别返回一个带有HTTP状态码和错误消息的ResponseEntity对象。由于我们使用了@RestControllerAdvice注解,异常处理方法的返回值将自动转换为HTTP响应的主体。

1.6 总结

@RestControllerAdvice注解是一个用于定义全局RESTful异常处理类的类级别注解。通过使用@RestControllerAdvice和@ExceptionHandler注解,你可以实现在整个应用程序范围内统一处理RESTful风格的异常。它自动将异常处理方法的返回值转换为HTTP响应的主体,使得代码更加简洁、可读和可维护。

2. @RestControllerAdvice注解 与 @ControllerAdvice注解的区别

特性@ControllerAdvice注解@RestControllerAdvice注解【实】
类型Class<?extends Throwable>[]String
适用场景适用于传统的Web应用程序,需要进行视图解析和渲染的场景适用于构建RESTful风格的Web服务,需要直接返回JSON格式响应体的场景
返回值返回视图名称或包装后的ModelAndView对象,用于视图解析和渲染返回JSON格式的响应体,用于直接返回给客户端
作用处理控制器中的异常、绑定和预处理等操作,并在多个控制器中共享处理控制器中的异常、绑定和预处理等操作,并直接返回JSON格式的响应体,用于构建RESTful风格的Web服务
使用的注解@ExceptionHandler、@InitBinder和@ModelAttribute等注解@ExceptionHandler、@InitBinder和@ModelAttribute等注解
返回值转换方式通过视图解析器和模板引擎将返回值转换为HTML或其他格式的响应体直接将返回值转换为JSON格式的响应体
返回值的处理方式需要进行视图解析和渲染,将结果包装成HTTP响应体,再返回给客户端直接将结果包装成HTTP响应体,并返回给客户端

到此这篇关于SpringBoot中的@RestControllerAdvice注解详解的文章就介绍到这了,更多相关@RestControllerAdvice注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你使用java实现去除各种空格

    教你使用java实现去除各种空格

    本文给大家汇总介绍了5种java中去除空格的方法,分别是String.trim()、str.replace(" ", "");、replaceAll(" +","");以及自定义的remove函数,非常的简单实用,需要的小伙伴可以参考下。
    2015-03-03
  • Java编程中字节流与字符流IO操作示例

    Java编程中字节流与字符流IO操作示例

    这篇文章主要介绍了Java编程中字节流与字符流IO操作示例,并且简单总结了IO流操作的基本规律,需要的朋友可以参考下
    2016-02-02
  • Java将Word转换成PDF的常用用法

    Java将Word转换成PDF的常用用法

    Java开发人员在处理文档转换时,常常需要将Word或Excel文档转换为PDF格式,以便于更好地保持格式一致性、便于分发和打印,这篇文章主要给大家介绍了关于Java将Word转换成PDF的常用用法,需要的朋友可以参考下
    2024-08-08
  • IDEA感觉不香了AI智能编程工具Cursor使用图文教程

    IDEA感觉不香了AI智能编程工具Cursor使用图文教程

    这篇文章主要介绍了IDEA感觉不香了AI智能编程工具Cursor使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • java Hibernate延迟加载

    java Hibernate延迟加载

    对one-to-one 关系进行延迟加载和其他关系相比稍微有些不同。many-to-one 的延迟加载是在配置文件的class 标签
    2008-10-10
  • java synchronized关键字的用法

    java synchronized关键字的用法

    synchronized关键字我们大家都知道是线程同步关键字.总结一下日常的使用方法,还有一个坑.
    2016-05-05
  • 使用IDEA将Java/Kotliin工程导出Jar包的正确姿势

    使用IDEA将Java/Kotliin工程导出Jar包的正确姿势

    这篇文章主要介绍了使用IDEA将Java/Kotliin工程导出Jar包的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • JavaMail实现邮件发送机制

    JavaMail实现邮件发送机制

    这篇文章主要为大家详细介绍了JavaMail实现邮件发送机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java子线程调用RequestContextHolder.getRequestAttributes()方法问题详解

    Java子线程调用RequestContextHolder.getRequestAttributes()方法问题详解

    这篇文章主要介绍了Java子线程调用RequestContextHolder.getRequestAttributes()方法问题处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Java中Aspose组件进行多文档间的转换方法总结

    Java中Aspose组件进行多文档间的转换方法总结

    在本篇文章里我们给大家分享了关于Java中Aspose组件进行多文档间的转换方法内容,需要的朋友们学习下吧。
    2019-02-02

最新评论