项目开发:@ControllerAdvice注解的基本应用
目录
- 简介
- 基本用法
- 全局异常处理
- 全局拦截器
- 全局数据绑定
- 注解参数
- 1.value(): String[]
- 2.basePackages(): String[]
- 3.basePackageClasses(): Class<?>[]
- 4.assignableTypes(): Class<?>[]
- 5.annotations(): Class<? extends Annotation>[]
- 三.注解组成
- 总结
简介
@ControllerAdvice 是 Spring 框架中提供的一个注解,用于定义一个组件,该组件可以集中处理来自不同控制器的异常或提供统一的拦截器功能。它主要用于以下几个方面:
- 全局异常处理:通过结合
@ExceptionHandler注解,可以捕获和处理在控制器中抛出的异常。 - 全局拦截器:通过实现
HandlerInterceptor接口,并在类上使用@ControllerAdvice注解,可以实现一个全局的拦截器,对控制器的方法调用进行拦截。 - 全局数据绑定:通过结合
@InitBinder注解,可以在控制器方法执行前对数据绑定进行预处理。
基本用法
全局异常处理
假设我们想要捕获并统一处理所有控制器抛出的 ArithmeticException 异常:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ArithmeticException.class)public ResponseEntity<Object> handleArithmeticException(ArithmeticException ex) {// 定义错误信息ApiError apiError = new ApiError("An arithmetic error occurred", ex.getMessage());// 返回错误响应return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);}
}
在这个例子中,任何控制器抛出的 ArithmeticException 都会被 GlobalExceptionHandler 类中的 handleArithmeticException 方法捕获,并返回一个包含错误信息的响应。
全局拦截器
创建一个全局拦截器来记录每个请求的处理时间:
@ControllerAdvice
public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("PreHandle: " + request.getRequestURI());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("PostHandle: " + request.getRequestURI());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long timeTaken = System.currentTimeMillis() - request.getAttribute("startTime") == null ? 0 : (Long) request.getAttribute("startTime");System.out.println("AfterCompletion: " + request.getRequestURI() + ", Time Taken: " + timeTaken + "ms");}
}
在 preHandle 方法中,你可以在控制器方法执行前进行一些操作,例如记录开始时间。postHandle 方法在控制器方法执行后执行,而 afterCompletion 方法在视图渲染后执行,适合用于记录请求处理的总时间。
全局数据绑定
自定义数据绑定:
@ControllerAdvice
public class MyDataBinder {@InitBinderpublic void initBinder(WebDataBinder binder) {// 可以在这里自定义属性编辑器binder.registerCustomEditor(MyObject.class, new MyObjectEditor());}
}
在这个例子中,我们通过 @InitBinder 注解定义了一个方法,该方法将在每个控制器方法调用之前执行,用于注册自定义的数据绑定行为。
注解参数
1.value(): String[]
用于指定要应用通知的包名。
例如:@ControllerAdvice(“org.example.controllers”)
2.basePackages(): String[]
与 value() 相同,用于指定要应用通知的包名。
例如:@ControllerAdvice(basePackages = “org.example.controllers”)
3.basePackageClasses(): Class<?>[]
用于指定要应用通知的基础包类。
例如:@ControllerAdvice(basePackageClasses = MyController.class)
4.assignableTypes(): Class<?>[]
用于指定要应用通知的特定类型。
例如:@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
5.annotations(): Class<? extends Annotation>[]
用于指定要应用通知的注解类型。
例如:@ControllerAdvice(annotations = RestController.class)
三.注解组成
@ControllerAdvice 实际上是一个组合注解(meta-annotation),它由几个其他的 Spring 注解组成。
@ControllerAdvice 的注解定义大致如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {// ... 参数定义
}
从这个定义中,我们可以看到 @ControllerAdvice 主要由以下注解组成:
-
@Target(ElementType.TYPE)
指定该注解可以应用于类级别。 -
@Retention(RetentionPolicy.RUNTIME)
指定该注解在运行时可用。 -
@Documented
表示该注解应该被包含在 JavaDoc 中。 -
@Component
这是最关键的组成部分。@Component 使得被 @ControllerAdvice 注解的类成为 Spring 容器管理的一个组件。
@Component 的存在意味着:
- @ControllerAdvice 注解的类会被自动检测并注册为 Spring Bean。
- 它允许该类被 Spring 的组件扫描机制识别和管理。
虽然 @ControllerAdvice 本身并不直接包含如 @ExceptionHandler、@InitBinder 或 @ModelAttribute 这样的功能性注解,但它为这些注解提供了一个全局的应用上下文。当与这些注解结合使用时,@ControllerAdvice 使得它们的作用范围扩展到了多个控制器。
重要的是要注意,@ControllerAdvice 本身并不提供任何具体的功能。它主要作为一个标记,告诉 Spring 框架这个类应该被特殊处理,允许其中的方法(通过其他注解如 @ExceptionHandler 等标记)应用于多个控制器。
总结
@ControllerAdvice 主要是通过 @Component 注解实现其核心功能,而其他的元注解(@Target, @Retention, @Documented)则提供了额外的元数据信息。这种组合使得 @ControllerAdvice 成为一个强大而灵活的工具,用于在 Spring MVC 应用中实现全局的控制器相关功能。
相关文章:
项目开发:@ControllerAdvice注解的基本应用
目录 简介基本用法全局异常处理全局拦截器全局数据绑定 注解参数1.value(): String[]2.basePackages(): String[]3.basePackageClasses(): Class<?>[]4.assignableTypes(): Class<?>[]5.annotations(): Class<? extends Annotation>[] 三.注解组成总结 简…...
Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】
目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…...
C++入门基础:C++中的循环语句
循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用,比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈,有时候一不小心会构成死循环或者…...
VUE 基础(二)
1 v-show:根据表达值的真假,切换元素的显示和隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…...
VMware Cloud Foundation ESXi 主机
一、准备嵌套 ESXi 主机环境# 1)物理 ESXi 主机信息 本次准备用于部署 VCF 嵌套实验环境的物理宿主机的配置信息如下图所示。其实,部署 VCF 环境主要对内存的大小要求比较高,部署完整的管理域相关组件下来差不多就要占用 200 GB左右内存,而对 CPU 和存储的需求可以根据实…...
PyTorch深度学习快速入门(下)
PyTorch深度学习快速入门(下) 一、现有网络模型的使用及修改(一)背景知识(二)修改网络模型的三种方法 二、网络模型的保存与加载(一)保存网络模型的两种方法(二ÿ…...
轻松入门Linux—CentOS,直接拿捏 —/— <1>
一、什么是Linux Linux是一个开源的操作系统,目前是市面上占有率极高的服务器操作系统,目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…...
pandas安装以及导入CSV
安装pandas pip install pandas速度慢可以切换国内镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas执行导入csv操作 import pandas as pd# 读取csv文件 data pd.read_csv(yourPath)输入data查看数据 导入成功!...
新能源车浪潮来袭,同时存在高压低压系统,如何准确进行高低压布线间距EMC分析?
摘要 随着车辆电气化水平的逐步提升,电气零部件布局和布线面临着前所未有的挑战,在不断的压缩电气零部件间间距后,EMC性能成为非常关键的性能指标。特别是对于新能源车型,同时存在高压和低压系统,高低压耦合若处理的不…...
QUIC 协议
详解 QUIC 协议:它为何比 TCP 更优越?...
【软件测试】--接口测试
1. 接口用例设计 接口测试的测试点 功能测试 单接口功能: 手工测试中的单个业务模块,一般对应一个接口 登陆业务 --> 登陆接口加入购物车业务 --> 加入购物车接口订单业务 --> 订单接口支付业务 --> 支付接口 借助工具、代码。绕开前端界面…...
【前端】上传视频,截取第一帧图片
使用input上传视频,获得视频的第一帧 参考:JavaScript获取视频的尺寸信息和第一帧图片 - 掘金 (juejin.cn) html: <inputbind:this{uploadRef}on:change{handleUpload}accept"video/*"type"file"/>视频类型校验&a…...
Redis-GEO数据结构的基本用法
GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有: GEOADD:添加一个地理空间信息,包含:经度…...
【Linux C | 网络编程】进程池大文件传输的实现详解(三)
上一篇实现了进程池的小文件传输,使用自定义的协议,数据长度数据本身,类似小火车的形式,可以很好的解决TCP“粘包”的问题。 【Linux C | 网络编程】进程池小文件传输的实现详解(二) 当文件的内容大小少于…...
Mac如何通过SSH连接Github
目录 前言 一、实现步骤 1.生成 SSH 密钥对 2.添加 SSH 密钥到 GitHub: 3.配置 SSH 连接 1.更新远程仓库 URL 2.测试 SSH 连接 前言 GitHub 在 2021 年 8 月 13 日停止了对使用密码进行身份验证的支持。因此,你需要使用其他认证方式,如…...
成就巴西休闲游戏如何借助Google谷歌广告投放优势
在探讨巴西休闲游戏如何借助谷歌广告投放优势实现市场扩张的过程中,我们不得不深入分析巴西市场的独特属性、休闲游戏的兴起背景,以及谷歌广告平台在全球范围内的强大影响力。近年来,随着移动游戏市场的快速发展,特别是中轻度休闲…...
利用python检查磁盘空间使用情况
目录 一.前言 二.使用的库介绍 三.代码实现以及解析 3.1导入模块 3.2邮件发送函数 send_email 3.3检查磁盘空间函数 check_and_clean_disk 3.4主程序逻辑 四.致谢 一.前言 在信息技术飞速发展的今天,数据量的激增使得磁盘空间管理成为系统运维中的一项基…...
卷积神经网络(五)---图像增强的方法
前面的部分专注于卷积神经网络的层结构介绍,同时还介绍了到目前为止比较出名的卷积神经网络,接着使用比较复杂的卷积神经网络提高了 MNIST 数据集的准确率。下面将从另外的角度——图像增强的方面入手,提高模型的准确率和泛化能力。 一直以来…...
矩阵常见分解算法及其在SLAM中的应用
文章目录 常见特殊矩阵定义Cholesky分解(正定Hermittian矩阵,分解结果唯一)Cholesky分解应用 SVD分解(将singularvalues排序后分解唯一)SVD 分解的应用(任意矩阵) QR分解(任意矩阵&a…...
【排序】快速排序详解
✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:排序 个人主页:Celias blog~ 一、快速排序的思想 快速排序的核心思想是: 选定一个…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
