返回
SpringBoot增强Controller方法:@ControllerAdvice用法解密
后端
2023-06-26 02:00:56
SpringBoot增强Controller方法:@ControllerAdvice详解
简介
在SpringBoot框架中,@ControllerAdvice
注解让你跨控制器地增强方法,统一处理异常和返回值。它创建增强类,应用于所有@RequestMapping
标记的方法,提供了诸多便利功能。
异常处理
@ControllerAdvice
注解可以让你处理控制器方法抛出的异常。在增强类中定义异常处理方法,当控制器方法抛出异常时,Spring Boot会自动调用该方法。
@ControllerAdvice
public class ExceptionHandlerAdvice {
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleException(Exception ex) {
// 处理异常,返回响应
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
}
}
返回值处理
你也可以使用@ControllerAdvice
注解处理控制器方法的返回值。在增强类中定义返回值处理方法,当控制器方法返回时,Spring Boot会自动调用该方法。
@ControllerAdvice
public class ReturnValueAdvice {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 注册自定义类型转换器
binder.registerCustomEditor(Date.class, new DateEditor());
}
}
其他增强行为
除了异常处理和返回值处理,@ControllerAdvice
注解还允许你定义其他增强行为,如安全检查、日志记录等。
@ControllerAdvice
public class SecurityAdvice {
@Before
public void before(HttpServletRequest request) {
// 进行安全检查
if (!isAuthenticated()) {
throw new UnauthorizedException();
}
}
}
使用场景
@ControllerAdvice
注解适用于以下场景:
- 异常处理: 统一处理控制器方法抛出的异常,简化错误处理。
- 返回值处理: 统一处理控制器方法的返回值,增强代码可读性。
- 其他增强行为: 实现安全检查、日志记录等额外功能,提升代码健壮性。
代码示例
以下是一个使用@ControllerAdvice
注解的代码示例:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
}
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
}
}
在这个示例中,GlobalExceptionHandler
增强类会处理UserController
中所有方法抛出的异常。
常见问题解答
1. 如何使用@ControllerAdvice
注解?
- 在控制器类上添加
@ControllerAdvice
注解,定义增强行为的类。
2. @ControllerAdvice
注解如何应用到控制器方法?
- Spring Boot会扫描并创建增强类,应用到所有
@RequestMapping
标记的方法。
3. 如何处理控制器方法中的异常?
- 在增强类中定义
@ExceptionHandler
注解的方法,处理不同的异常类型。
4. 如何统一处理控制器方法的返回值?
- 在增强类中定义
@InitBinder
注解的方法,注册自定义类型转换器或其他返回值处理逻辑。
5. @ControllerAdvice
注解可以增强哪些其他行为?
- 安全检查、日志记录、参数验证等。