11.@ControllerAdvice

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.@ControllerAdvice相关的知识,希望对你有一定的参考价值。

@ControllerAdvice

主要作用:

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

1.全局异常处理

本例延用上一篇文件上传,通过设定文件上传的大小,从而使程序抛出异常,然后处理。

  1. 首先设置文件上传大小限制

    spring.servlet.multipart.max-file-size=1KB
    
  2. 定义全局异常处理器MyGlobalException

    @RestControllerAdvice
    public class MyGlobalException {
        @ExceptionHandler(Exception.class)         //这个注解可以指定要拦截的异常
        public String myException(Exception e){
            return e.getMessage();              //把异常返回到前端
    
        }
    
    
    }
    
  3. 验证结果
    在这里插入图片描述

拓展:

  • @ExceptionHandler 可以指定要处理的异常

  • 我们可以通过断点调试,获取异常名

在这里插入图片描述

  • 处理单个异常:

    @RestControllerAdvice
    public class MyGlobalException {
        @ExceptionHandler(MaxUploadSizeExceededException.class)         //这个注解可以指定要拦截的异常
        public String myException(MaxUploadSizeExceededException e){
            return "文件太大了!";            //把异常返回到前端
    
        }
    }
    

在这里插入图片描述

  • 返回一个视图

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>error</title>
    </head>
    <body>
    <h1 th:text="${error}"></h1>
    </body>
    </html>
    
    //@RestControllerAdvice
    @ControllerAdvice
    public class MyGlobalException {
    //    @ExceptionHandler(MaxUploadSizeExceededException.class)         //这个注解可以指定要拦截的异常
    //    public String myException(MaxUploadSizeExceededException e){
    //        return "文件太大了!";            //把异常返回到前端
    //
    //    }
    
        @ExceptionHandler(MaxUploadSizeExceededException.class)         //这个注解可以指定要拦截的异常
       public ModelAndView error(MaxUploadSizeExceededException e){
            ModelAndView modelAndView = new ModelAndView("error");
            modelAndView.addObject("error",e.getMessage());
            return modelAndView;
    
        }
    
    
    
    }
    

2.全局数据绑定

主要用来做初始化操作,我们可以把项目用到的公共的东西,添加到有@ControllerAdvice的类中,这样都可以访问到。

案例:

  1. 编写全局数据类MyGlobalData

    @ControllerAdvice
    public class MyGlobalData {
       // @ModelAttribute //不指定key默认是map  key:map value:info
         @ModelAttribute("info") //指定名称后通过info获取  key:info  value:info
        public Map<String,String> myData(){
            Map<String, String> info = new HashMap();
            info.put("userName","wangze");
            info.put("hobby","girl");
            return info;
    
        }
    

注意:

  1. @ModelAttribute:
    该注解通常在Controller上的某个方法上,此方法会首先被调用,并将方法作为Mode的属性,然后再调用对应的Controller处理方法。

在项目中别的类中也可以访问到info中的数据

3.全局数据预处理

当两个bean中有相同属性,前端传来的值无法区分到底是谁的

解决思路:

  • 用@ModelAttribute给参数定义别名
    用对应的Controller处理方法。

在项目中别的类中也可以访问到info中的数据

3.全局数据预处理

一般不会使用,出现问题说明设计有问题!

当两个bean中有相同属性,前端传来的值无法区分到底是谁的

解决思路:

  • 用@ModelAttribute给参数定义别名
  • 然后在全局数据预处理类中用@InitBinder 与相应的方法来处理(增加前缀,前缀就是别名)

以上是关于11.@ControllerAdvice的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数