-
@ControllerAdvice本质上是一个@Component,因此会被spring当作组件进行扫描
-
就是AOP的一种实现,通过告知ControllerAdvice拦截规则,他可以进行拦截,然后通过
@ExceptionHandler
、@InitBinder
或@ModelAttribute
这三个注解来做更细致的拦截后的处理 -
可以指定多种Advice规则,
-
可以写成@ControllerAdvice("org.my.pkg")
或者
@ControllerAdvice(basePackages="org.my.pkg")匹配org.my.pkg包及其子包下的所有
Controller。 -
可以通过数组来匹配多个@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"})
-
可以通过自定义注解如:@CustomAnnotation,匹配标注了自定义注解的controller
@ControllerAdvice(annotations={CustomAnnotation.class}) 还有很多方法慢慢遇见。
-
-
@ControllerAdvice
配合@ExceptionHandler
实现全局异常处理@ExceptionHandler标注在方法上,如上面的全局异常处理标注@ExceptionHandler(value = Exception.class),说明此方法用于处理Exception及其一下所有子类的类型的异常,
-
如果参数为空呢------就是默认为方法三处列表中出现的任何异常,所有异常都能接住。
-
Throwable是所有异常的父类,默认接收Throwable及其一下的所有类型的异常。
-
5. @ControllerAdvice
配合 @ModelAttribute
预设全局数据
1.@ModelAttribute源码
2. 在标注了@ModelAttribute的方法上可以容许往Model中注入全局属性(可以提供给所有Controller中注有@RequestMapping的方法使用,属性value和
name用于指定 属性的
key,binding表示是否绑定,默认为
tru e
-
全局参数的绑定
-
//方法一 @ControllerAdvice public class MyGlobalHandler { @ModelAttribute public void presetParam(Model model){ model.addAttribute("globalAttr","this is a global attribute"); } } //方法二 @ControllerAdvice public class MyGlobalHandler { @ModelAttribute() public Map<String, String> presetParam(){ Map<String, String> map = new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); return map; } }
-
全局参数的使用
@RestController public class AdviceController { @GetMapping("methodOne") public String methodOne(Model model){ Map<String, Object> modelMap = model.asMap(); return (String)modelMap.get("globalAttr"); } @GetMapping("methodTwo") public String methodTwo(@ModelAttribute("globalAttr") String globalAttr){ return globalAttr; } @GetMapping("methodThree") public String methodThree(ModelMap modelMap) { return (String) modelMap.get("globalAttr"); } }
6.
@ControllerAdvice
配合@InitBinder
实现对请求参数的预处理该注解作用于方法上,用于将前端请求的特定类型的参数在到达controller之前进行处理,从而达到转换请求参数格式的目的。//TODO主要细节遇到后再研究叭