目录

@ControllerAdvice 用法

1、全局异常处理

2、添加全局数据


@ControllerAdvice 用法

顾名思义,@ControllerAdvice就是@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。

1、全局异常处理

@ControllerAdvice最常见的使用场景就是全局异常处理。比如文件上传大小限制的配置,如果用户上传的文件超过了限制大小,就会抛出异常,此时可以通过@ControllerAdvice结合@ExceptionHandler定义全局异常捕获机制,代码如下:

import lombok.extern.slf4j.Slf4j;
import net.xdclass.util.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;@ControllerAdvice // 需要返回ResponseBody
// @RestControllerAdvice 直接返回Json数据不用返回ResponseBody
@Slf4j
public class CustomExceptionHandler {// 自定义异常@ExceptionHandler(value = Exception.class) // 要捕获哪种异常@ResponseBody // 要是用上面的 @RestControllerAdvice 就不用加此注解public JsonData handler(Exception e) {if (e instanceof RuntimeException) { // 判断是不是其子类BizException bizException = (BizException) e;log.error("[业务异常]{}", e);return JsonData.buildCodeAndMsg(bizException.getCode(), bizException.getMsg());} else {log.error("[系统异常]{},e");return JsonData.buildError("系统异常");}}}

附 BizException.class,代码如下

import lombok.Data;
import net.xdclass.enums.BizCodeEnum;@Data
public class BizException extends RuntimeException {private int code;private String msg;// 构造函数public BizException(Integer code, String message) {super(message);this.code = code;this.msg = message;}// 构造函数public BizException(BizCodeEnum bizCodeEnum) {super(bizCodeEnum.getMessage());this.code = bizCodeEnum.getCode();this.msg = bizCodeEnum.getMessage();}}

自定义异常枚举类 BizCodeEnum.java

public enum BizCodeEnum {/*** 短链分组*/GROUP_REPEAT(23001, "分组名重复"),GROUP_OPER_FAIL(23503, "分组名操作失败"),GROUP_NOT_EXIST(23404, "分组不存在"),/*** 验证码*/CODE_TO_ERROR(240001, "接收号码不合规"),CODE_LIMITED(240002, "验证码发送过快"),CODE_ERROR(240003, "验证码错误"),CODE_CAPTCHA_ERROR(240101, "图形验证码错误"),/*** 账号*/ACCOUNT_REPEAT(250001, "账号已经存在"),ACCOUNT_UNREGISTER(250002, "账号不存在"),ACCOUNT_PWD_ERROR(250003, "账号或者密码错误"),ACCOUNT_UNLOGIN(250004, "账号未登录"),/*** 短链*/SHORT_LINK_NOT_EXIST(260404, "短链不存在"),/*** 订单*/ORDER_CONFIRM_PRICE_FAIL(280002, "创建订单-验价失败"),ORDER_CONFIRM_REPEAT(280008, "订单恶意-重复提交"),ORDER_CONFIRM_TOKEN_EQUAL_FAIL(280009, "订单令牌缺少"),ORDER_CONFIRM_NOT_EXIST(280010, "订单不存在"),/*** 支付*/PAY_ORDER_FAIL(300001, "创建支付订单失败"),PAY_ORDER_CALLBACK_SIGN_FAIL(300002, "支付订单回调验证签失败"),PAY_ORDER_CALLBACK_NOT_SUCCESS(300003, "支付宝回调更新订单失败"),PAY_ORDER_NOT_EXIST(300005, "订单不存在"),PAY_ORDER_STATE_ERROR(300006, "订单状态不正常"),PAY_ORDER_PAY_TIMEOUT(300007, "订单支付超时"),/*** 流控操作*/CONTROL_FLOW(500101, "限流控制"),CONTROL_DEGRADE(500201, "降级控制"),CONTROL_AUTH(500301, "认证控制"),/*** 流量包操作*/TRAFFIC_FREE_NOT_EXIST(600101, "免费流量包不存在,联系客服"),TRAFFIC_REDUCE_FAIL(600102, "流量不足,扣减失败"),TRAFFIC_EXCEPTION(600103, "流量包数据异常,用户无流量包"),/*** 通用操作码*/OPS_REPEAT(110001, "重复操作"),OPS_NETWORK_ADDRESS_ERROR(110002, "网络地址错误"),/*** 文件相关*/FILE_UPLOAD_USER_IMG_FAIL(700101, "用户头像文件上传失败");private String message;private int code;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}BizCodeEnum(int code, String message) {this.code = code;this.message = message;}}

只需在系统中定义CustomExceptionHandler类,然后添加@ControllerAdvice注解即可。当系统启动时,该类就会被扫描到Spring容器中,然后定义handler方法,在该方法上添加了@ExceptionHandler注解,其中定义的Exception.class 表明该方法用来处理所有类型的异常。如果想让该方法处理所有类型的异常,只需将Exception改为 其他Exception即可。方法的参数可以有异常实例、HttpServletResponse以及HttpServletRequest、Model 等,返回值可以是一段JSON、一个ModelAndView、一个逻辑视图名等。

2、添加全局数据

@ControllerAdvice是一个全局数据处理组件,因此也可以在@ControllerAdvice中配置全局数据,使用@ModelAttribute注解进行配置,代码如下:

@ControllerAdvice
public class GlobalConfig {@ModelAttribute(value = "info")public Map<String, String> userInfo() {HashMap<String, String> map = new HashMap<>();map.put("username", "罗贯中");map.put("gender", "男");return map;}
}

代码解释:

  • 在全局配置中添加userInfo方法,返回一个map。该方法有一个注解@ModelAttribute,其中的value属性表示这条返回数据的key,而方法的返回值是返回数据的value。
  • 此时在任意请求的Controller 中,通过方法参数中的Model都可以获取info 的数据。

Controller 例代码如下:

public class MyController {@GetMapping("/hello")@ResponseBodypublic void hello(Model model) {Map<String, Object> map = model.asMap();Set<String> keySet = map.keySet();Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();Object value = map.get(key);System.out.println(key + ">>>>>" + value);}}
}

在请求方法中,将Model 中的数据打印出来,如图所示。

还有其他用法见转载链接

@ControllerAdvice 用法相关推荐

  1. 算法学习之路和程序员(技术)学习必读书籍

    原文链接:http://lucida.me/blog/on-learning-algorithms/ 转 算法学习之路和程序员(技术)学习必读书籍 2015年05月26日 09:46:56 阅读数:1 ...

  2. spring boot中@ControllerAdvice的用法,全局异常处理,全局数据绑定,全局数据预处理

    1: @ControllerAdvice理解 @ControllerAdvice是spring 3.2提供的新注解,他是一个controller增强器,加了@ControllerAdvice的类为那些 ...

  3. 全局异常捕获处理-@ControllerAdvice+@HandleException

    涂涂影院管理系统这个demo中有个异常管理的标签,用于捕获 涂涂影院APP用户异常信息 ,有小伙伴好奇,排除APP,后台端的是如何处理全局异常的,故项目中的实际应用已记之. 关于目前的异常处理 在使用 ...

  4. @ControllerAdvice这个注解主要作用是什么

    增强型控制器,对于控制器的全局配置放在同一个位置 @ControllerAdvice是在类上声明的注解,其用法主要有三点: 1.@ExceptionHandler这个注解则表示Controller中任 ...

  5. Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常

    文章目录 概述 未使用全局异常且未显式捕获异常的情况 使用全局异常 Step1. 自定义异常类 Step2. 封装异常信息模板 Step3. 全局异常处理类 Step4. 使用全局异常 小结 概述 我 ...

  6. controlleradvice 参数_Spring MVC之@ControllerAdvice详解

    对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不仅限于此.ControllerAdvice拆分开来就是Controlle ...

  7. exceptionhandler注解_SpringMVC 中 @ControllerAdvice 注解的三种使用场景!

    @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...

  8. Spring 3.2 @ControllerAdvice批注的异常处理

    不久前,我写了一个博客,概述了如何将Spring示例代码升级到3.2版,并演示了其中的一些小"陷阱". 从那以后,我一直在仔细阅读Spring 3.2的新功能列表,尽管它不包含任何 ...

  9. spring的@ControllerAdvice注解

    @ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理. 对于@ControllerAdvic ...

最新文章

  1. 【MATLAB】符号数学计算(五):符号函数的替换
  2. DJango-如何快速准备Python虚拟开发环境并快速定制一个项目
  3. CSS before / after伪元素
  4. PS制作高光导航背景
  5. centos5.5中安装mysql5.5.3
  6. js if判断多个条件_JS条件判断小技巧(一)
  7. java 技能鉴定_JAVA试题-技能鉴定
  8. LeetCode OJ 160. Intersection of Two Linked Lists
  9. 序列化数据导入mysql_[导入]对象序列化后保存到数据库
  10. Alluxio2.X简要介绍
  11. 查看局域网中的其他机器的IP地址
  12. 洛必达法则介绍及使用注意点
  13. 一个牛人给JAVA初学者的建议(很受用)
  14. 为什么PDF文件无法编辑?
  15. windows配置mysql8.0主从数据库,主从数据同步。
  16. 大盘最可能走出的两种局势(转 封起De日子)
  17. Linux - vi命令编辑后 wq 与 x 区别是什么?
  18. 母函数——整数拆分(HDOJ2152)
  19. 【年度总结】— 向前一步
  20. 别怕看源码,一张图搞定Mybatis的Mapper原理

热门文章

  1. esxi系统重装与vsan恢复
  2. SAP BASIS ADM100 中文版 Unit 5(4)
  3. 网络封包分析工具Charles
  4. GitHub2022年十大热门编程语言榜单
  5. php 域名恶意解析,防止恶意域名解析
  6. ubuntu16.04+nvidia gt740m+cuda7.5+caffe安装、测试经历
  7. c++ 常用STL 之unordered_map
  8. VB编程:IsNumeric判断闰年-48
  9. 2022年各大企业java面试题解析,堪称全网最详细的java面试指南
  10. springboot+Quartz整合!!!简单实用