项目开发:@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~ 一、快速排序的思想 快速排序的核心思想是: 选定一个…...
圆桌探讨AI原生人才:从定义、来源到培养留存,为企业老板提供实战手册
嘉宾介绍真正AI原生的人或不来现场,对于积极转型的20%人群,有实战手册可用于找到、培养并留住他们。目前,仅1%的企业是AI原生企业,20%积极拥抱变化,80%在苦苦挣扎,人才情况也类似。一场圆桌深入探讨企业“赶…...
边缘多模态AI驱动的文档重构技术
1. 项目概述:当打印机和扫描仪开始“读懂”文档的真正意图你有没有遇到过这样的场景:客户用手机随手拍了一张合同,边缘歪斜、背景杂乱、光线不均,发到公司邮箱里;行政同事用老式扫描仪扫了一份带表格的报销单ÿ…...
别再手搓流程图了!用WPF从零封装一个可拖拽、可连接的业务节点控件(附完整源码)
WPF业务流程图控件开发实战:从零构建可拖拽节点系统 在当今企业级应用开发中,可视化业务流程配置已成为提升用户体验的关键要素。无论是审批流程引擎、ETL数据处理管道,还是自动化任务编排系统,都需要直观的节点连接界面。本文将深…...
Python实现“打家劫舍“的一种方法
Python实现“打家劫舍“的一种方法 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 …...
从show version到设备‘体检报告’:新手也能看懂的思科路由器健康状态自查指南
从show version到设备‘体检报告’:新手也能看懂的思科路由器健康状态自查指南 当你第一次面对思科路由器的命令行界面,输入show version后看到满屏密密麻麻的信息,是不是感觉像拿到了一份天书般的体检报告?别担心,今天…...
对比直接使用厂商API体验Taotoken在用量监控方面的便利性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商API体验Taotoken在用量监控方面的便利性 在直接调用多个大模型厂商的API进行开发时,一个普遍存在的管…...
Kali Linux 2024.2 环境下,用 Python 脚本复现一次 DDoS 攻击实验(仅供学习防御)
Kali Linux 2024.2环境下Python脚本模拟DDoS攻击实验与防御研究 在网络安全领域,理解攻击原理是构建有效防御体系的基础。本文将带您在Kali Linux 2024.2环境中,通过Python脚本模拟一次DDoS攻击实验,重点分析攻击流量特征,并探讨如…...
Java 11环境下,PotatoTool最新版安装配置与常见问题排错指南
Java 11环境下PotatoTool专业部署与深度调优指南 工具定位与核心价值 PotatoTool作为一款面向网络安全领域的多合一解决方案,其设计初衷是解决安全从业者在日常工作中频繁切换工具的痛点。不同于市面上功能单一的安全工具,它通过模块化架构实现了从流量分…...
通过Taotoken的CLI工具一键配置开发环境与API密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken的CLI工具一键配置开发环境与API密钥 对于需要接入多个大模型服务的开发团队而言,统一管理API密钥和端点配…...
如何用Easy Voice Toolkit轻松实现语音AI全流程:从识别到合成的完整指南
如何用Easy Voice Toolkit轻松实现语音AI全流程:从识别到合成的完整指南 【免费下载链接】Easy-Voice-Toolkit A user-friendly toolkit for voice recgonition/transcription/conversion etc. | 简单易用的语音工具箱 项目地址: https://gitcode.com/gh_mirrors/…...
