SpringMVC中@controllerAdvice注解的详细解释

 更新时间:2022年02月17日 10:32:57   作者:zhangkaixuan456  
刚接触SpringMVC应该很少会见到这个注解,其实它的作用非常大,下面这篇文章主要给大家介绍了关于SpringMVC中@controllerAdvice注解的相关资料,需要的朋友可以参考下

这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:

1.全局异常处理;

2.全局数据绑定

3.全局数据预处理

1.全局异常处理

使用 @ControllerAdvice 实现全局异常处理,只需要定义类,添加该注解即可定义方式如下:

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView customException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", e.getMessage());
        mv.setViewName("myerror");
        return mv;
    }
}

@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。

2.全局数据绑定

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

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ModelAttribute(name = "md")
    public Map<String,Object> mydata() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 99);
        map.put("gender", "男");
        return map;
    }
}

使用 @ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAttribute 注解的 name 属性去重新指定 key。

  定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        Map<String, Object> map = model.asMap();
        System.out.println(map);
     
    }
}

输出结果:

3.全局数据预处理

考虑我有两个实体类,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 的全局数据预处理可以解决这个问题

解决步骤如下:

1.给接口中的变量取别名

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

2.进行请求数据预处理

在 @ControllerAdvice 标记的类中添加如下代码:

@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前缀.

总结

到此这篇关于SpringMVC中@controllerAdvice注解的文章就介绍到这了,更多相关SpringMVC中@controllerAdvice注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java下载文件的四种方式详细代码

    Java下载文件的四种方式详细代码

    这篇文章介绍了Java下载文件的四种方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Java代码实现循环队列的示例代码

    Java代码实现循环队列的示例代码

    队列作为基础的数据结构,是程序员的入门课。也是所有程序员必须掌握的一种数据结构,队列在程序中广泛应用,因此我们应该对队列有深入的了解,接下来我们通过代码来对队列这种数据结构进行深度解析,感兴趣的朋友一起看看吧
    2021-09-09
  • Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-09-09
  • SpringBoot MongoDB 索引冲突分析及解决方法

    SpringBoot MongoDB 索引冲突分析及解决方法

    这篇文章主要介绍了SpringBoot MongoDB 索引冲突分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Mybatis重置Criteria的正确姿势分享

    Mybatis重置Criteria的正确姿势分享

    这篇文章主要介绍了Mybatis重置Criteria的正确姿势,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中枚举类enum的values()方法举例详解

    Java中枚举类enum的values()方法举例详解

    这篇文章主要给大家介绍了关于Java中枚举类enum的values()方法举例详解,作为一种常用方法,可以在枚举中对数组里的枚举值进行遍历,这就是values()方法的使用,需要的朋友可以参考下
    2023-11-11
  • Java自定义Enum的实现示例

    Java自定义Enum的实现示例

    Java中的自定义Enum类型是一种特殊的类,用于表示固定数量的常量值,本文主要介绍了Java自定义Enum的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Spring中@Repository注解的作用和用法以及和@Mapper的区别详析

    Spring中@Repository注解的作用和用法以及和@Mapper的区别详析

    这篇文章主要给大家介绍了关于Spring中@Repository注解的作用和用法以及和@Mapper的区别的相关资料,注解的作用是标识一个类为数据访问对象,并由Spring框架进行实例化和管理,需要的朋友可以参考下
    2023-09-09
  • springboot自动装配的源码与流程图

    springboot自动装配的源码与流程图

    在日常的开发过程中Spring Boot自动装配的特性给我们开发减少了很多重复性的工作,这篇文章主要给大家介绍了关于springboot自动装配的相关资料,需要的朋友可以参考下
    2021-08-08
  • Java实用小技能之快速创建List常用几种方式

    Java实用小技能之快速创建List常用几种方式

    java集合可以说无论是面试、刷题还是工作中都是非常常用的,下面这篇文章主要给大家介绍了关于Java实用小技能之快速创建List常用的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论