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-05-05
  • Java使用Spring JdbcTemplate向in语句中传递参数的教程详解

    Java使用Spring JdbcTemplate向in语句中传递参数的教程详解

    这篇文章主要给大家介绍Java如何使用Spring JdbcTemplate向in语句中传递参数,文中有详细的流程步骤和代码示例,需要的朋友可以参考下
    2023-07-07
  • IDEA Eval Reset 使用方法汇总

    IDEA Eval Reset 使用方法汇总

    本文给大家介绍了IDEA Eval Reset 使用方法,安装插件包括离线安装方式和在线安装方式,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • 聊聊注解@controller@service@component@repository的区别

    聊聊注解@controller@service@component@repository的区别

    这篇文章主要介绍了聊聊注解@controller@service@component@repository的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot参数校验的方法总结

    SpringBoot参数校验的方法总结

    今天带大家学习SpringBoot参数校验的方法,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • 基于接口实现java动态代理示例

    基于接口实现java动态代理示例

    这篇文章主要介绍了基于接口实现java动态代理示例,需要的朋友可以参考下
    2014-04-04
  • java面向对象继承与多态介绍

    java面向对象继承与多态介绍

    大家好,本篇文章主要讲的是java面向对象继承与多态介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • SpringBoot自定义启动器Starter流程详解

    SpringBoot自定义启动器Starter流程详解

    SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰
    2022-11-11
  • Java中判断对象是否相等的equals()方法使用教程

    Java中判断对象是否相等的equals()方法使用教程

    与==运算符响应,equals()方法也是Java中对对象进行比较的一大方式,要特别注意二者的不同点,这个我们在下文中即将讲到,接下来我们就来看一下Java中判断对象是否相等的equals()方法使用教程
    2016-05-05
  • springBoot 整合ModBus TCP的详细过程

    springBoot 整合ModBus TCP的详细过程

    ModBus是一种串行通信协议,用于从仪器和控制设备传输信号到主控制器或数据采集系统,它分为主站和从站,主站获取和编写数据,从站则是设备,本文给大家介绍springBoot 整合ModBus TCP的详细过程,感兴趣的朋友一起看看吧
    2025-01-01

最新评论