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.发送请求
5.结果:
原文来自:http://www.javaboy.org/2019/0422/springmvc-controlleradvice.html
分类:
无
标签:
无