如何实现一个Java的@注解?
先看一段代码:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity defaultErrorHandler(Exception e) {// 将错误信息转成字符串String errorMessage = ExceptionUtils.getStackTrace(e);// 创建响应实体,包含错误消息和状态码return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);}
}
上述代码中,GlobalExceptionHandler类用@ControllerAdvice注解标识,表示其定义的配置和方法能够全局应用。
然后在该类中定义了一个defaultErrorHandler方法,并用@ExceptionHandler注解标识。这个方法定义了对任意Exception类型异常的处理。当任意一个Controller中抛出Exception类型的异常时,这个方法就会被调用。方法内部首先将异常详细堆栈信息转成字符串,然后以此为响应体,返回一个500状态码的ResponseEntity对象。
所以嘛再上代码:
先定义一个注解(BankResponseBody):
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BankResponseBody {
}
通过@ControllerAdvice注解实现和这个注解:
// ControllerAdvice将会被应用到所有带有@BankResponseBody注解的控制器!!!
@ControllerAdvice(annotations = {BankResponseBody.class})
@Slf4j
// 声明了公共的 BankResponseBodyAdvice类,并实现了 ResponseBodyAdvice接口
public class BankResponseBodyAdvice implements ResponseBodyAdvice { @Override // 这个方法决定当前HandlerMethod的执行返回的对象是否支持拦截public boolean supports(MethodParameter returnType, Class converterType) { return true; // 设定为返回true,表示支持所有类型}@Override// 这个方法在将返回值写入到Response前执行public Object beforeBodyWrite( Object body, // 准备写入Response的对象MethodParameter returnType, // HandlerMethod的返回类型MediaType selectedContentType, // 响应的内容类型Class selectedConverterType, // 选择的转换器类型ServerHttpRequest request, // 当前的请求对象ServerHttpResponse response) // 当前的响应对象{log.info("处理XX回调接口的返回值{}",body); // 使用log对象记录一条信息,{}这是占位符,表示日志中的动态内容,这里会被body替换。return body; // 返回经处理后的对象,这里直接返回了原封不动的body}
}
实现了吧 (^_^)∠※
然后在Spring框架中,除了ResponseBodyAdvice,还存在许多其他接口吗?
有的常见的包括:
-
RequestBodyAdvice接口:这个接口和ResponseBodyAdvice相似,不过它是用来处理请求数据的,即在请求数据绑定到方法参数上之前对请求数据进行预处理。 -
HandlerInterceptor接口:这个接口用于拦截处理Controller的请求,它有三个方法:preHandle(在Controller方法执行前调用),postHandle(在Controller方法执行后,渲染视图前调用),afterCompletion(渲染视图后调用)。 -
WebMvcConfigurer接口:这个接口通常用于扩展Spring MVC的功能,比如添加视图控制器、静态资源处理、拦截器等。 -
ViewResolver接口:这个接口用于将逻辑视图名解析为具体的视图对象。
以上只是一部分接口,Spring中有大量的接口可供开发者使用,来满足不同的开发需求。一般来说,每个接口都有其特定的应用场景和作用,具体要选择使用哪个接口,取决于你希望实现的功能。
还有其他实用注解吗?
有的,@ControllerAdvice是Spring框架中一个非常实用的注解。它是一个@Component类,所以Spring容器会自动检测到它。@ControllerAdvice注解允许我们将一些全局的配置(例如异常处理、数据绑定等)提取出来放在一个地方,让所有的控制器都能享用,简化了代码的复用。
使用@ControllerAdvice可以做到以下的一些事情,让我们的程序更优雅:
-
全局异常处理:我们可以使用@ControllerAdvice和@ExceptionHandler注解捕获全局异常。
-
全局数据绑定:我们可以使用@ControllerAdvice和@ModelAttribute注解将常用的数据放在一个地方,每个Controller都能访问到。
-
全局数据预处理:我们可以使用@ControllerAdvice和@InitBinder注解,对请求参数进行预处理。
所以说,如果你正在使用Spring框架,那么这个注解肯定会是你的最佳助手之一!
相关文章:
如何实现一个Java的@注解?
先看一段代码: ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(value Exception.class)public ResponseEntity defaultErrorHandler(Exception e) {// 将错误信息转成字符串String errorMessage ExceptionUtils.getStackTrace(e);// 创…...
嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换
系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…...
迅饶科技 X2Modbus 网关 GetUser 信息泄露漏洞复现
0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…...
修改亚马逊云科技账户的密码和MFA
要使用AWS CLI删除当前账户的多因素认证(MFA)设备并修改密码,你需要先确保已安装并配置了AWS CLI,并且你的账户有足够的权限执行这些操作。下面是如何分步进行的指导: 1. 删除MFA设备 首先,你需要找出MFA设备的序列号或ARN。可以…...
提升性能与精准追踪:SkyWalking自定义跟踪忽略插件
前言 当使用分布式追踪系统时,有时需要排除某些端点或路径,以减轻追踪系统的负载或减少不必要的数据收集。为了满足这种需求,SkyWalking 提供了一个可选的插件,即 apm-trace-ignore-plugin,它允许自定义需要跳过的路径…...
第十三届蓝桥杯大赛软件赛省赛CC++大学B组
第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组 文章目录 第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组1、九进制转十进制2、顺子日期3、刷题统计4、修建灌木5、x进制减法6、统计子矩阵7、积木画8、扫雷9、李白打酒加强版10、砍竹子 1、九进制转十进制 计算器计算即可。2999292。 2、…...
zookeeper监听集群节点的实现zkclient组件实现方案(Java版)
ZooKeeper Watcher 机制 client 向zookeeper 注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象 package com.jacky.zk.demo;import org.I0Itec.zkclient.IZkChildListener;…...
【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能
【Arduino&Quartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能 一、将Reindeer软核下载到STEP CYC10(一)下载PulseRain Reindeer软核(二)配置Reindeer软核到开发板1.将sof文件转换为jic文件2.将jic文…...
【电路笔记】-逻辑与门
逻辑与门 文章目录 逻辑与门1、概述2、2 输入晶体管与门3、数字与门类型4、7408 四路 2 输入与门逻辑与门是一种数字逻辑电路,仅当其所有输入均为高电平时,其输出才会变为高电平至逻辑电平 1。 1、概述 数字逻辑与门的输出状态仅在其任何输入处于逻辑电平“0”时再次返回“低…...
蓝桥杯练习——拼出一个未来
选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果: 目标 完善 js/index.js 的 TODO 部分,实…...
stm32f103c8t6学习笔记(学习B站up江科大自化协)-SPI
SPI通信 SPI,(serial peripheral interface),字面翻译是串行外设接口,是一种通用的数据总线,适用于主控和外挂芯片之间的通信,与IIC应用领域非常相似。 IIC无论是在硬件电路还是在软件时序设计…...
云计算的安全需求
目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务(云计算安全类)资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…...
【C++】编程规范之表达式原则
表达式中变量的位置 在编写表达式时,将变量放置在右边,可以提高代码的可读性和可理解性。这种做法符合自然语言的阅读习惯,使得代码更易于理解。 // Good if (5 x) {// do something }// Avoid if (x 5) {// do something }不变量和资源申…...
Python人工智能基础知识:理解神经网络与机器学习的基本概念
人工智能(Artificial Intelligence,AI)是当今科技领域的热门话题之一,而神经网络和机器学习作为AI的两个重要分支,在解决各种问题中发挥着重要作用。本文将详细介绍神经网络和机器学习的基本概念,帮助读者更…...
10_MVC
文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例(开发与Json相关接口) 三层架构三层架构介绍 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是存…...
【Java多线程(4)】案例:设计模式
目录 一、什么是设计模式? 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式? 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…...
时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测
时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-BiLST…...
java面试题(4)|Spring和Spring Boot之间有什么关联和区别
文章目录 Spring和Spring Boot的有什么关联?Spring和Spring Boot有什么区别?如何快速区分某个项目采用的是 Spring 还是 Spring Boot? Spring和Spring Boot的有什么关联? Spring Boot是建立在Spring框架之上的,因此它…...
Spring Boot中前端通过请求接口下载后端存放的Excel模板
导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…...
构建企业级微服务平台:实现可扩展性、弹性和高效性
在软件开发的快速发展领域中,企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现,再加上云原生技术的应用,创建敏捷且具有弹性的平台的可能性是无限的。在本指南中,我们将深入探讨使用强大的工具和技术组合…...
ChatTTS 量化模型实战:从模型压缩到推理效率提升
最近在部署 ChatTTS 模型时,遇到了一个很实际的问题:模型虽然效果不错,但体积大、推理慢,在资源受限的边缘设备上跑起来非常吃力。显存动不动就占好几个G,生成一段语音的等待时间也让人着急。为了解决这个问题…...
低成本DIY智能小车核心模块:用STM32和TB6612实现带编码器的定速巡航功能
低成本DIY智能小车核心模块:用STM32和TB6612实现带编码器的定速巡航功能 周末在工作室调试新做的智能小车时,突然意识到一个有趣的现象:当我们给电机设定固定转速后,实际速度总会因为电池电压波动、负载变化等因素产生偏差。这让…...
突破局限:开源微信插件WeChatExtension-ForMac革新体验全解析
突破局限:开源微信插件WeChatExtension-ForMac革新体验全解析 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 作为Mac用户&a…...
5分钟搞定多聚焦图像融合:从数据集到评价指标全流程指南
5分钟搞定多聚焦图像融合:从数据集到评价指标全流程指南 多聚焦图像融合技术正逐渐成为计算机视觉领域的热门研究方向。这项技术通过将多张聚焦区域不同的图像合成为一张全清晰的图像,解决了单次拍摄无法同时捕捉场景中所有物体清晰细节的难题。对于刚接…...
UVM避坑指南:为什么你的sequence卡住了?item_done没调用的常见问题排查
UVM验证中的sequence卡死问题:item_done未调用的深度排查手册 在芯片验证领域,UVM框架的sequence机制堪称验证工程师的"瑞士军刀",但这把利器偶尔也会出现卡壳的情况。想象一下这样的场景:你的验证环境已经运行了数百个…...
从零搭建硬件测试台:手把手教你用LabVIEW连接菊水PBZ40电源并读取数据
从零搭建硬件测试台:LabVIEW与菊水PBZ40电源的深度集成实战 在工业自动化和科研测试领域,可编程电源的系统集成一直是工程师面临的常见挑战。菊水PBZ40系列作为实验室常用高精度电源,其RS232C接口与LabVIEW图形化编程环境的结合,能…...
WuliArt Qwen-Image Turbo新手教程:Prompt怎么写?效果不好怎么调?
WuliArt Qwen-Image Turbo新手教程:Prompt怎么写?效果不好怎么调? 刚接触WuliArt Qwen-Image Turbo,是不是感觉有点懵?看着那个简洁的输入框,心里琢磨着:“我该写点啥才能让它画出我想要的图&a…...
如何在普通PC上低成本部署Qwen3?VLLM轻量化配置指南
如何在普通PC上低成本部署Qwen3?VLLM轻量化配置指南 对于大多数个人开发者和小型团队来说,高性能服务器和顶级显卡往往是可望而不可及的奢侈品。但别担心,即使你只有一台普通PC,也能通过合理的配置和优化手段成功部署Qwen3这样的大…...
Wan2.2-I2V-A14B企业级落地:API服务压测报告(QPS 3.2,延迟<1.8s)
Wan2.2-I2V-A14B企业级落地:API服务压测报告(QPS 3.2,延迟<1.8s) 1. 测试环境与配置 1.1 硬件配置 GPU:RTX 4090D 24GB显存(专用优化版)CPU:10核心处理器内存:120G…...
[特殊字符] Nano-Banana参数详解:LoRA权重对部件排布影响的实证分析
Nano-Banana参数详解:LoRA权重对部件排布影响的实证分析 1. 项目简介 Nano-Banana是一款专为产品拆解和平铺展示风格设计的轻量化文本生成图像系统。这个项目的核心价值在于深度融合了专属的Turbo LoRA微调权重,专门针对Knolling平铺、爆炸图、产品部件…...
