@ControllerAdvice

  1. @ControllerAdvice本质上是一个@Component,因此会被spring当作组件进行扫描

  2. 就是AOP的一种实现,通过告知ControllerAdvice拦截规则,他可以进行拦截,然后通过@ExceptionHandler@InitBinder@ModelAttribute这三个注解来做更细致的拦截后的处理

  3. 可以指定多种Advice规则

    1. 可以写成@ControllerAdvice("org.my.pkg")或者@ControllerAdvice(basePackages="org.my.pkg")匹配org.my.pkg包及其子包下的所有Controller。

    2. 可以通过数组来匹配多个@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"})

    3. 可以通过自定义注解如:@CustomAnnotation,匹配标注了自定义注解的controller

      @ControllerAdvice(annotations={CustomAnnotation.class}) 还有很多方法慢慢遇见。

  4. @ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理

    @ExceptionHandler标注在方法上,如上面的全局异常处理标注@ExceptionHandler(value = Exception.class),说明此方法用于处理Exception及其一下所有子类的类型的异常,

    1. 如果参数为空呢------就是默认为方法三处列表中出现的任何异常,所有异常都能接住。

    2. Throwable是所有异常的父类,默认接收Throwable及其一下的所有类型的异常。

5. @ControllerAdvice 配合 @ModelAttribute 预设全局数据

1.@ModelAttribute源码

2. 在标注了@ModelAttribute的方法上可以容许往Model中注入全局属性(可以提供给所有Controller中注有@RequestMapping的方法使用,属性valuename用于指定 属性的key,binding表示是否绑定,默认为tru e

  1. 全局参数的绑定

  2. //方法一
    @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;
        }
    ​
    }

  3. 全局参数的使用

    @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主要细节遇到后再研究叭

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值