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 可以指定要处理的异常

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

11.@ControllerAdvice_第1张图片

  • 处理单个异常:

    @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>errortitle>
    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 与相应的方法来处理(增加前缀,前缀就是别名)

你可能感兴趣的:(springboot,2,spring,spring,boot,新星计划)