推荐答案
@ControllerAdvice
是 Spring MVC 中的一个注解,用于全局处理控制器中的异常、绑定数据以及模型属性的初始化。它可以将多个 @ExceptionHandler
、@InitBinder
和 @ModelAttribute
方法集中到一个类中,从而实现对多个控制器的统一处理。
本题详细解读
1. 全局异常处理
@ControllerAdvice
最常见的用途是全局异常处理。通过在 @ControllerAdvice
注解的类中定义 @ExceptionHandler
方法,可以捕获并处理控制器中抛出的异常。例如:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }
在这个例子中,handleException
方法会捕获所有控制器中抛出的 Exception
异常,并返回一个包含错误信息的 ResponseEntity
。
2. 全局数据绑定
@ControllerAdvice
还可以用于全局数据绑定。通过在 @ControllerAdvice
注解的类中定义 @InitBinder
方法,可以自定义数据绑定的行为。例如:
@ControllerAdvice public class GlobalBindingHandler { @InitBinder public void initBinder(WebDataBinder binder) { binder.setDisallowedFields("id"); } }
在这个例子中,initBinder
方法会禁止所有控制器中的 id
字段绑定。
3. 全局模型属性初始化
@ControllerAdvice
还可以用于全局模型属性的初始化。通过在 @ControllerAdvice
注解的类中定义 @ModelAttribute
方法,可以为所有控制器的模型添加公共属性。例如:
@ControllerAdvice public class GlobalModelAttributeHandler { @ModelAttribute public void addAttributes(Model model) { model.addAttribute("globalAttribute", "This is a global attribute"); } }
在这个例子中,addAttributes
方法会为所有控制器的模型添加一个名为 globalAttribute
的属性。
4. 限定作用范围
@ControllerAdvice
还可以通过 @ControllerAdvice(annotations = RestController.class)
或 @ControllerAdvice(basePackages = "com.example.controllers")
等方式限定其作用范围,使其只对特定的控制器或包中的控制器生效。
5. 总结
@ControllerAdvice
提供了一种集中处理控制器中的异常、数据绑定和模型属性的方式,使得代码更加模块化和易于维护。通过合理使用 @ControllerAdvice
,可以减少重复代码,提高代码的可读性和可维护性。