SpringBoot中的@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注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- SpringBoot使用@RestController处理GET和POST请求的代码详解
- SpringBoot中@RestControllerAdvice @ExceptionHandler异常统一处理类失效原因分析
- SpringBoot中@RestControllerAdvice注解的使用
- SpringBoot的@RestControllerAdvice作用详解
- SpringBoot中@RestControllerAdvice注解实现全局异常处理类
- SpringBoot常用注解@RestControllerAdvice详解
- SpringBoot @RestControllerAdvice注解对返回值统一封装的处理方法
- springboot @Controller和@RestController的区别及应用详解
- SpringBoot http请求注解@RestController原理解析
- springboot中@RestController注解实现