目录

SpringMvc @ControllerAdvice注解的使用场景.md

李羽秋
李羽秋 2022年01月26日  ·  阅读 1,294

SpringMvc @ControllerAdvice注解的使用场景

1. @ControllerAdvice 主要可以实现

  • 全局数据绑定
  • 全局数据预处理

2.全局数据绑定

1.首先我们先定义一个存放公共数据的controller类

@ControllerAdvice
public class CommonController {
    @ModelAttribute(name="student")
    public Map<String,Object> mydata(){
        HashMap<String,Object> map =new HashMap<>();
        map.put("age",10);
        map.put("gender","男");
        return map;
    }
    @ModelAttribute(name="xiaohong")
    public Map<String,Object>data2(){
        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
        stringObjectHashMap.put("age",20);
        stringObjectHashMap.put("gender","女");
        return stringObjectHashMap;
    }
}

2.其次,我们再新建一个controller类来尝试获取commoncontroller存放的数据

 @GetMapping("/test")
    public String hello(Model model){
        Object xiaohong = model.getAttribute("xiaohong");
        System.out.println(xiaohong);
        return "test";
    }

由此可见,全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了@ControllerAdvice注解类中,这样每一个controller的接口中,就都能够访问这些数据。

3.全局数据预处理、

场景:因为两个实体都有一个name属性,从前端传递时,无法区分。因此可以通过@ControllerAdvice的全局数据预处理可以解决

这个问题。

1.首先先定义book和author两个实体

@Data
public class Book {
    private String name;
    private Long price;
}
@Data
public class Author {
    private String name;
    private Integer age;
}

2.定义一个数据添加接口,给接口变量取别名

  @PostMapping("/book")
    public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author){
        System.out.println(book);
        System.out.println(author);
    }

3.新建一个controller类来进行预处理

@ControllerAdvice
public class PreHandlerController {
    @InitBinder("b")
    public void b(WebDataBinder binder){
        binder.setFieldDefaultPrefix("b.");
    }
    @InitBinder("a")
    public void a(WebDataBinder binder){
        binder.setFieldDefaultPrefix("a.");
    }
}

ps:@initBinder("b")注解表示该方法用来处理和Book相关的参数,在方法中,给参数添加一个b的前缀,即请求参数要有b前缀

4.发送请求

image-20220119152639066

5.结果:

image-20220119152656803

原文来自:http://www.javaboy.org/2019/0422/springmvc-controlleradvice.html

分类:
标签: