@ControllerAdvice
Posted javazl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ControllerAdvice相关的知识,希望对你有一定的参考价值。
@ControllerAdvice是@Controller注解的一个增强,这个注解是Spring里面的东西,可以处理全局异常。当然在Spring Boot中也可以使用,但是Spring Boot中有它全自动化配置的异常处理,因为是全自动化的,因此也可以自己定制,比如定制它的异常页面,异常信息提示,异常视图。这里的话主要看一下,这个注解怎么用。它主要有一下几个功能:
- 处理全局异常
- 预设全局数据
- 请求参数预处理
先看第一个全局异常的处理:
举个例子,比如做文件上传的时候,Spring Boot中默认的单个文件上传大小是1MB,如果我们将它改成1KB,我们看一下效果。
显然这个界面是不友好的,那么我们可以用@ControllerAdvice做一个全局异常处理,去捕获这个异常,并定制我们返回的结果:
package com.zl.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.multipart.MaxUploadSizeExceededException; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @ControllerAdvice public class MyAdviceException { //MaxUploadSizeExceededException,这个是异常类,这里可以枚举多个异常 @ExceptionHandler(MaxUploadSizeExceededException.class) public void myexcept(MaxUploadSizeExceededException e, HttpServletResponse response){ response.setContentType("text/html;charset=utf-8"); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException ex) { ex.printStackTrace(); } writer.write("文件太大,请重新选择"); writer.flush(); writer.close(); } }
访问页面结果:
第二个我们看一下预设全局数据:
预设数据就是我们可以设置一个全局数据在任何的controller中都可以获取到。
package com.zl.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ModelAttribute; import java.util.HashMap; import java.util.Map; //全局预设数据 @ControllerAdvice public class GlobalData { @ModelAttribute public Map<String,Object> mydata(){ HashMap<String, Object> map = new HashMap<>(); map.put("name","zl"); map.put("age","21"); return map; } }
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.sql.SQLOutput; import java.util.Map; import java.util.Set; //在Controller中获取预设数据 @RestController public class GlobalDataInfoController { @GetMapping("/data") public String data(Model model){ Map<String, Object> map = model.asMap(); Set<String> strings = map.keySet(); for (String key : strings) { System.out.println(key+":"+map.get(key)); } return "data"; } }
展示结果:
第三个看一下请求参数预处理:
这个的话,是由于开发者参数取名的时候有重名,一般很少遇到,但是如果遇到了,通过技术也可以解决。在这里就不做演示了。有兴趣的可以自己尝试。
以上是关于@ControllerAdvice的主要内容,如果未能解决你的问题,请参考以下文章
springboot + @ControllerAdvice + @ExceptionHandler 实现全局异常拦截,不用
SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)
在 SpringBoot 应用程序的 ControllerAdvice 中访问 HttpSession