- 后端数据传递到前端接界面时,有时实体类不可避免的会存在相同的属性,传递到前端界面无法区分
- 为了解决这个问题,可以在Controller的方法中用@ModelAttribute()注解给两个实体类上添加别名,然后在@ControllerAdvice注解的类方法中使用@InitBinder注解,为添加了别名的实体类的参数全部添加上前缀或后缀等操作来区分
- 我有两个实体类,Book 和 Author
public class Book{
private String name;
private Long price;
//getter/setter
}
public class Author{
private String name;
private
Integer age;
//getter/setter
}
- 此时,如果我定义一个数据添加接口,如下:
@PostMapping("/book")
public void addBook(Book book, Author
author){
System.out.println(book);
System.out.println(author);
}
- 这个时候,添加操作就会有问题,因为两个实体类都有一个 name 属性,从前端传递时 ,无法区分。此时,通过 @ControllerAdvice 的全局数据预处理可以解决这个问题
示例
- bookController.java
@Controller
public class bookController{
//给接口中的变量取别名
@PostMapping("/book")
public void addBook(@ModelAttribute("b")Book book, @ModelAttribute("a")Author author){
System.out.println(book);
System.out.println(author);
}
}
- InitBinderHandler.java
@ControllerAdvice
public class MyGlobalExceptionHandler{
//在 @ControllerAdvice 标记的类中添加@InitBinder
@InitBinder("b")
public void b(WebDataBinder binder){
binder.setFieldDefaultPrefix("b."); //绑定前缀
}
@InitBinder("a")
public void a(WebDataBinder binder){
binder.setFieldDefaultPrefix("a."); //绑定前缀
}
}
- @InitBinder("b") 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀.
- 请求发送时,通过给不同对象的参数添加不同的前缀,可以实现参数的区分.