Spring MVC @ControllerAdvice注解
@ControllerAdvice 用于定义全局的控制器增强,其方法应用于所有控制器。
注解组合
| 组合注解 | 等价于 | 用途 |
|---|---|---|
| @RestControllerAdvice | @ControllerAdvice + @ResponseBody | REST API 全局处理 |
全局异常处理
Java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public Result<Void> handleBusiness(BusinessException ex) {
return Result.fail(ex.getCode(), ex.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleValidation(MethodArgumentNotValidException ex) {
String message = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(", "));
return Result.fail(400, message);
}
@ExceptionHandler(Exception.class)
public Result<Void> handleException(Exception ex) {
log.error("系统异常", ex);
return Result.fail(500, "系统异常");
}
}
全局模型属性
Java
@ControllerAdvice
public class GlobalModelAttribute {
@ModelAttribute("currentUser")
public User currentUser(HttpServletRequest request) {
return (User) request.getSession().getAttribute("user");
}
}
所有视图都可访问 ${currentUser}。
全局数据绑定
Java
@ControllerAdvice
public class GlobalBinder {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 注册自定义编辑器
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
// 注册自定义验证器
binder.addValidators(new CustomValidator());
}
}
限定作用范围
Java
// 限定包范围
@ControllerAdvice("com.example.web")
// 限定注解范围
@ControllerAdvice(annotations = RestController.class)
// 限定类范围
@ControllerAdvice(basePackageClasses = UserController.class)
异常处理优先级
Java
控制器内 @ExceptionHandler > @ControllerAdvice @ExceptionHandler
多个 @ControllerAdvice 的优先级通过 @Order 控制:
text
@Order(1)
@RestControllerAdvice
public class HighPriorityExceptionHandler {
// 高优先级
}
@Order(2)
@RestControllerAdvice
public class LowPriorityExceptionHandler {
// 低优先级
}
@ControllerAdvice 默认对所有控制器生效,可通过属性限定范围。
要点总结
- @ControllerAdvice 定义全局控制器增强
- 配合 @ExceptionHandler 实现全局异常处理
- 配合 @ModelAttribute 添加全局模型属性
- 配合 @InitBinder 配置全局数据绑定
📝 发现内容有误?点击此处直接编辑