@ControllerAdvice使用场景

目录

1、ExceptionHandler

2、InitBinder

3、ModelAttribute


    在Spring MVC进行调用的过程中,会有很多的特殊的需求。比如全局异常,分页信息和分页搜索条件,请求时带来返回时还得回显页面。Spring提供@ControllerAdvice对需要处理的范围进行配置。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
    // 控制的扫描包范围
    @AliasFor("basePackages")
    String[] value() default {};

    // 控制的扫描包范围
    @AliasFor("value")
    String[] basePackages() default {};

    // 控制的包类
    Class<?>[] basePackageClasses() default {};

    // @Controller或者@RestController的类 的数据
    Class<?>[] assignableTypes() default {};

    // 控制范围可以用注解进行配置
    Class<? extends Annotation>[] annotations() default {};
}

 

1、ExceptionHandler

    系统比较庞大时很多的异常是不能控制,或者未知的,不能将所有的sql异常,反射异常,类不存在等抛到页面上展示给用户。则需要一个全局的拦截器处理,Spring 提供了@ExceptionHandler处理方式。

1)、全局异常处理定义

@ControllerAdvice(basePackages = "com.kevin.tool")
public class ExceptionHandlerController {
    /**
     * 错误后返回json
     * 如果想跳转到专门的异常界面,则可以返回{@link org.springframework.web.servlet.ModelAndView}
     *
     * @return 标准异常json
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Map<String, String> handler() {
        Map<String, String> errorMap = new HashMap<String, String>(16);
        errorMap.put("code", "500");
        errorMap.put("msg", "系统异常,请稍后重试");
        return errorMap;
    }
}

2)、控制器方法调用异常

@RestController
public class ControllerAdviceDemoController {

    @ResponseBody
    @RequestMapping("bindException")
    public String bindException() {
        getMessage();
        return "ok";
    }

    private void getMessage() {
        throw new RuntimeException("未知异常!");
    }
}

3)、访问效果

2、InitBinder

    数据绑定有很多的场景,当前比如前端传入的日期为字符串类型,后端按照Format进解析为日期。

1)、全局日期绑定定义

@ControllerAdvice(basePackages = "com.kevin.tool")
public class ExceptionHandlerController {

    @InitBinder("date")
    public void globalInitBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
}

2)、控制器方法调用日期转换

@RestController
public class ControllerAdviceDemoController {

    @ResponseBody
    @RequestMapping(value = "/initBind", method = RequestMethod.GET)
    public String detail(@RequestParam("id") long id, Date date) {

        System.out.println(date);
        System.out.println(id);

        return "ok";
    }
}

3)、收到的日期类型效果

    访问地址为:http://127.0.0.1:9999/initBind?id=123&date=2019-12-30

3、ModelAttribute

    先看看@ModelAttribute的注解信息,元注解@Target指定可以修饰方法参数和方法(全局)。当前模拟一种常见,就是将所有输出的信息都加上当前的平台信息(比如版本等公共信息,这种需求还是比较多的)。

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModelAttribute {
    
    @AliasFor("name")
    String value() default "";
    
    @AliasFor("value")
    String name() default "";

    boolean binding() default true;
}

1)、全局返回属性添加

@ControllerAdvice(basePackages = "com.kevin.tool")
public class ExceptionHandlerController {

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "hello");

        HashMap<String, String> map = new HashMap<>(16);
        map.put("version", "1.0.0");
        map.put("name", "XXX平台");
        model.addAttribute("platform", map);
    }
}

2)、控制器方法访问

@RestController
public class ControllerAdviceDemoController {

    @GetMapping("/modelAttributeTest")
    private String modelAttributeTest(@ModelAttribute("msg") String msg,
        @ModelAttribute("platform") Map<String, String> platform) {

        String result = "msg:" + msg + "<br>" + "info:" + platform;
        return result;
    }

}

3)、输出效果

 

 

 

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值