SpringMVC中的ControllerAdvice注解

绝地灬酷狼 2021-11-05 04:30 426阅读 0赞

SpringMVC中的ControllerAdvice注解

  • 前言
  • 全局异常处理
  • 全局数据绑定
  • 全局数据预处理

前言

@ControllerAdvice是一个非常使用的注解,本文主要介绍@Controller注解的三种功能:
1.全局异常处理
2.全局数据绑定
3.全局数据预处理

全局异常处理

使用@ControllerAdvice可以实现全局异常处理

  1. @ControllerAdvice
  2. public class MyGlobalHandler {
  3. @ExceptionHandler(Exception.class)
  4. public ModelAndView allException(Exception e){
  5. ModelAndView mv = new ModelAndView();
  6. mv.addObject("message",e.getMessage());
  7. mv.setViewName("myerror");
  8. return mv;
  9. }
  10. }

@ExceptionHandler()中注明处理的异常类型,可以使用不同的方法处理不同的异常,也可以像上面一样,一个方法处理所有异常。

全局数据绑定

全局数据绑定功能可以用来做一些数据初始化工作,可以将一些公共的数据定义在@ControllerAdvice标记的类中,在所有Controller中都可以读取数据。使用@ModelAttribute注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。

  1. @ControllerAdvice
  2. public class MyGlobalHandler {
  3. @ModelAttribute("md")
  4. public Map<String,Object> myData(){
  5. HashMap<String, Object> map = new HashMap<>();
  6. map.put("age", 100);
  7. map.put("gender", "男");
  8. return map;
  9. }
  10. }

任意定义一个Controller,我们可以访问里面的数据

  1. @RestController
  2. public class HelloController {
  3. @GetMapping
  4. public String hello(Model model){
  5. Map<String,Object> map = model.asMap();
  6. System.out.println(map);
  7. return "hello";
  8. }
  9. }

在这里插入图片描述

全局数据预处理

首先定义两个实体类

  1. public class Book {
  2. private String name;
  3. private Double price;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public Double getPrice() {
  11. return price;
  12. }
  13. public void setPrice(Double price) {
  14. this.price = price;
  15. }
  16. @Override
  17. public String toString() {
  18. return "Book{" +
  19. "name='" + name + '\'' +
  20. ", price=" + price +
  21. '}';
  22. }
  23. }
  24. public class Student {
  25. private String name;
  26. private Integer age;
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public Integer getAge() {
  34. return age;
  35. }
  36. public void setAge(Integer age) {
  37. this.age = age;
  38. }
  39. @Override
  40. public String toString() {
  41. return "Student{" +
  42. "name='" + name + '\'' +
  43. ", age=" + age +
  44. '}';
  45. }

此时,如果定义一个接口

  1. @GetMapping("/print")
  2. public void print(Book book,Student student){
  3. System.out.println(book);
  4. System.out.println(student);
  5. }

这个操作就会有问题,因为两个实体类都有一个 name 属性,从前端传递时 ,无法区分。此时,通过 @ControllerAdvice 的全局数据预处理可以解决这个问题
解决步骤如下:
1.给变量取别名

  1. @GetMapping("/print")
  2. public void print(@ModelAttribute("b") Book book, @ModelAttribute("s") Student student){
  3. System.out.println(book);
  4. System.out.println(student);
  5. }

2.对数据进行预处理

  1. @InitBinder("b")
  2. public void b(WebDataBinder wdb){
  3. wdb.setFieldDefaultPrefix("b.");
  4. }
  5. @InitBinder("s")
  6. public void s(WebDataBinder wdb){
  7. wdb.setFieldDefaultPrefix("s.");
  8. }

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

3.发送请求
请求发送时,通过给不同对象的参数添加不同的前缀,可以实现参数的区分.
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,426人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ControllerAdvice注解使用

    为了方便对异常的统一管理,spring mvc提供了ControllerAdvice注解对异常进行统一的处理,拿到这些异常信息后,可以做一些处理,比如提供一个统一的web界面查