11.@ControllerAdvice
Posted 结构化思维wz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.@ControllerAdvice相关的知识,希望对你有一定的参考价值。
@ControllerAdvice
主要作用:
- 全局异常处理
- 全局数据绑定
- 全局数据预处理
1.全局异常处理
本例延用上一篇文件上传,通过设定文件上传的大小,从而使程序抛出异常,然后处理。
-
首先设置文件上传大小限制
spring.servlet.multipart.max-file-size=1KB
-
定义全局异常处理器MyGlobalException
@RestControllerAdvice public class MyGlobalException { @ExceptionHandler(Exception.class) //这个注解可以指定要拦截的异常 public String myException(Exception e){ return e.getMessage(); //把异常返回到前端 } }
-
验证结果
拓展:
-
@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的类中,这样都可以访问到。
案例:
-
编写全局数据类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; }
注意:
@ModelAttribute:
该注解通常在Controller
上的某个方法上,此方法会首先被调用,并将方法作为Mode
的属性,然后再调用对应的Controller
处理方法。
在项目中别的类中也可以访问到info中的数据
3.全局数据预处理
当两个bean中有相同属性,前端传来的值无法区分到底是谁的
解决思路:
- 用@ModelAttribute给参数定义别名
用对应的Controller
处理方法。
在项目中别的类中也可以访问到info中的数据
3.全局数据预处理
一般不会使用,出现问题说明设计有问题!
当两个bean中有相同属性,前端传来的值无法区分到底是谁的
解决思路:
- 用@ModelAttribute给参数定义别名
- 然后在全局数据预处理类中用@InitBinder 与相应的方法来处理(增加前缀,前缀就是别名)
以上是关于11.@ControllerAdvice的主要内容,如果未能解决你的问题,请参考以下文章