【Java】SpringMVC ResponseBodyAdvice详解
目录
1. ResponseBodyAdvice
2. supports方法
3. beforeBodyWrite方法
4. 实践
1. ResponseBodyAdvice
Spring MVC的ResponseBodyAdvice是Spring 4.1版本中引入的一个接口,它允许在Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后,对自定义响应中的内容进行处理。
具体来说,当Controller方法返回一个值时,该值会作为入参传递给ResponseBodyAdvice的beforeBodyWrite()方法。在beforeBodyWrite()方法中,你可以对返回值进行一些定制操作,例如对返回值进行一层封装,然后再将其写入到response中。
ResponseBodyAdvice只支持@ResponseBody注解的Controller方法,因此如果Controller方法中没有@ResponseBody注解,ResponseBodyAdvice无法对其返回值进行处理。
使用ResponseBodyAdvice可以实现以下两个主要功能:
- 统一处理http接口返回值结构:由于不同的http接口返回值结构可能各异,因此需要一种方式来统一处理这些返回值。通过使用ResponseBodyAdvice,可以在返回值写入response之前对其进行封装,将不同的返回值结构统一为一种结构,方便后续处理。
- 对http接口返回值进行加密处理:为了保护数据的安全性,有时候需要对http接口返回值进行加密处理。使用ResponseBodyAdvice可以在返回值写入response之前对其进行加密,从而避免将加密逻辑入侵到每个接口代码中,简化了加密处理的过程。
使用ResponseBodyAdvice的方法有两种:
- 在RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver中注册实现类:可以直接将实现类注册到RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver中,让Spring自动检测并使用。
- 使用@ControllerAdvice注解:可以将实现类用@ControllerAdvice注解进行标记,让Spring自动检测并使用。同时,被@ControllerAdvice注解标记的类可以起到集中处理的作用,可以对多种情况进行统一处理。
总的来说,ResponseBodyAdvice是Spring MVC中一个非常有用的接口,它可以对Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后自定义响应中的内容进行处理,从而实现统一处理http接口返回值结构和加密处理等功能。
有两个比较重要的方法进行讲解。
2. supports方法
Spring MVC的ResponseBodyAdvice接口中的supports方法主要是用于判断是否符合处理条件。这个方法的返回值是一个布尔值,当返回值为true时,会调用beforeBodyWrite方法对返回值进行处理,否则不进行处理。
具体来说,当一个Controller方法返回一个值时,该值会作为参数传递给supports方法。在supports方法中,你可以编写自己的逻辑来判断是否需要对返回值进行处理。如果返回true,则将返回值传递给beforeBodyWrite方法,在beforeBodyWrite方法中对返回值进行处理后,再将其写入response中。
一般来说,supports方法的实现会比较简单,只需要根据特定的条件判断是否需要对返回值进行处理即可。例如,如果需要对返回值进行加密处理,可以在supports方法中判断请求的url是否符合加密处理的条件,如果符合则返回true,否则返回false。
需要注意的是,supports方法只判断是否需要对返回值进行处理,并不会对Controller方法的返回值类型进行限制。因此,如果Controller方法返回一个自定义类型,需要自行实现supports方法来支持对该类型的处理。
3. beforeBodyWrite方法
Spring MVC的ResponseBodyAdvice接口中的beforeBodyWrite方法是在Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后,对自定义响应中的内容进行处理的具体实现方法。
具体来说,当Controller方法返回一个值时,该值会作为参数传递给supports方法进行判断是否需要处理。如果返回true,则将返回值作为参数传递给beforeBodyWrite方法。在beforeBodyWrite方法中,你可以编写自己的逻辑来对返回值进行处理,例如对返回值进行一层封装、加密处理等,然后将处理后的结果写入response中返回给客户端。
一般来说,beforeBodyWrite方法的实现会比较复杂,需要详细的逻辑来对返回值进行处理。例如,如果需要对返回值进行加密处理,可以在beforeBodyWrite方法中获取加密秘钥,然后对返回值进行加密处理,最后将加密后的结果写入response中返回给客户端。
需要注意的是,beforeBodyWrite方法的参数中包括了Request对象和Response对象,可以从中获取到请求和响应的相关信息。因此,在实现beforeBodyWrite方法时,可以根据需要对请求和响应进行相应的处理。
总的来说,Spring MVC的ResponseBodyAdvice接口中的beforeBodyWrite方法是实现自定义响应处理的核心方法,通过它可以将返回值进行一层封装、加密处理等操作,最终将处理后的结果写入response中返回给客户端。
4. 实践
- 自定义注解@ResultResponse,作为supports的判断条件,是否用来处理。
- 新建类ResponseBodyAdvice实现ResponseBodyAdvice<Object>,重写supports和beforeBodyWrite方法。
- 新建BaseController,类上添加注解@ApiResultResponse。
// 1
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResultResponse {boolean enable() default true;}// 2
@RestControllerAdvice
@RequiredArgsConstructor
public class ResponseBodyAdvice implements ResponseBodyAdvice<Object> {/*1. MethodParameter是Spring MVC中的一个类,代表着一个方法参数,包括方法参数的注解、参数类型等信息。在supports方法中,可以通过MethodParameter对象获取当前处理方法的注解、返回值类型等信息,从而对请求进行相应的处理。2. Class<? extends HttpMessageConverter<?>>是HttpMessageConverter接口的子类类型,代表着用于处理HTTP消息的转换器类型。在supports方法中,可以通过Class对象获取用于处理HTTP消息的转换器类型,从而根据不同的转换器类型对请求和响应进行相应的处理。*/@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//根据相应逻辑进行判断是否需要处理}/* Object代表着Controller方法的返回值,即需要进行处理的对象。在beforeBodyWrite方法中,可以通过该对象获取返回值的具体内容,并对其进行相应的处理。MethodParameter是Spring MVC中的一个类,代表着一个方法参数,包括方法参数的注解、参数类型等信息。在beforeBodyWrite方法中,可以通过MethodParameter对象获取当前处理方法的注解、返回值类型等信息,从而对请求进行相应的处理。MediaType是Spring MVC中的一个类,代表着HTTP消息的媒体类型,例如application/json、text/html等。在beforeBodyWrite方法中,可以通过MediaType对象获取当前处理请求的媒体类型,从而根据不同的媒体类型对请求和响应进行相应的处理。Class<? extends HttpMessageConverter<?>>是HttpMessageConverter接口的子类类型,代表着用于处理HTTP消息的转换器类型。在beforeBodyWrite方法中,可以通过Class对象获取用于处理HTTP消息的转换器类型,从而根据不同的转换器类型对请求和响应进行相应的处理。ServerHttpRequest是Spring MVC中的一个接口,代表着当前处理的HTTP请求。在beforeBodyWrite方法中,可以通过ServerHttpRequest对象获取当前请求的相关信息,例如请求头、请求参数等,从而对请求进行相应的处理。ServerHttpResponse是Spring MVC中的一个接口,代表着当前处理的HTTP响应。在beforeBodyWrite方法中,可以通过ServerHttpResponse对象获取当前响应的相关信息,例如响应头、响应状态码等,从而对响应进行相应的处理。*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class<?extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {//进行实际处理}}// 3
@ApiResultResponse
public class BaseController {}
实际开发中Controller继承BaseController就可用了。
相关文章:
【Java】SpringMVC ResponseBodyAdvice详解
目录 1. ResponseBodyAdvice 2. supports方法 3. beforeBodyWrite方法 4. 实践 1. ResponseBodyAdvice Spring MVC的ResponseBodyAdvice是Spring 4.1版本中引入的一个接口,它允许在Controller控制器中ResponseBody修饰的方法或ResponseEntity执行之后ÿ…...
python常见面试题五
解释 Python 中的列表推导式 (list comprehension)。 答:列表推导式是一种创建新列表的简洁方式。它可以在一行代码中通过对一个可迭代对象应用表达式和条件来生成新的列表。 解释 Python 中的时间复杂度和空间复杂度。 答:时间复杂度衡量算法运行时间的…...

SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)
本文适用对象:已有基础的同学,知道基础的SpringBoot配置和Vue操作。 在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。 一、实时显示数据库数据 实现步骤: 第1步:编写动态请求响应类:…...
曙光亮相工博会,发布首款国产高端工业实时仿真计算系统
9月19日-23日,中科曙光亮相第23届中国国际工业博览会,并受邀于主论坛发表主题演讲,在工业权威会议上展示曙光领先的工业数字化技术与实践成果。展会期间,曙光重磅发布首款国产工业实时仿真计算系统,并展出多项工业数字…...

「大数据-2.0」安装Hadoop和部署HDFS集群
目录 一、下载Hadoop安装包 二、安装Hadoop 0. 安装Hadoop前的必要准备 1. 以root用户登录主节点虚拟机 2. 上传Hadoop安装包到主节点 3. 解压缩安装包到/export/server/目录中 4. 构建软链接 三、部署HDFS集群 0. 集群部署规划 1. 进入hadoop安装包内 2 进入etc目录下的hadoop…...

文档在线预览word、pdf、excel文件转html以实现文档在线预览
目录 一、前言 1、aspose2 、poi pdfbox3 spire二、将文件转换成html字符串 1、将word文件转成html字符串 1.1 使用aspose1.2 使用poi1.3 使用spire2、将pdf文件转成html字符串 2.1 使用aspose2.2 使用 poi pbfbox2.3 使用spire3、将excel文件转成html字符串 3.1 使用aspose…...
FFmpeg视音频分离器----向雷神学习
雷神博客地址:https://blog.csdn.net/leixiaohua1020/article/details/39767055 本程序可以将封装格式中的视频码流数据和音频码流数据分离出来。 在该例子中, 将FLV的文件分离得到H.264视频码流文件和MP3 音频码流文件。 注意: 这个是简化版…...
CentOS 8开启bbr
CentOS 8 默认内核版本为 4.18.x,内核版本高于4.9 就可以直接开启 BBR,所以CentOS 8 启用BBR非常简单不需要再去升级内核。 开启bbr echo "net.core.default_qdiscfq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_contro…...

Redis的安装与基本使用
文章目录 Linux 环境下安装Redis下载Redis 安装包解压安装包安装Redis进入redis安装包下编译并且安装到指定目录下 启动redis配置远程访问找到Redis.config文件 Windows 环境下安装Redis说明官方提供方式安装或启用WSL2在WSL(Ubuntu)上安装Redis启动Redi…...

2014 款金旅牌小型客车 发动机怠速抖动、加速无力
故障现象 一辆2014款金旅牌小型客车,搭载JM491Q-ME发动机,累计行驶里程约为20万km。车主反映,最近该车发动机怠速抖动、加速无力,且经常缺少冷却液。 故障诊断 根据车主描述的故障现象,初步判断该车气缸垫损坏&#…...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化...
全文链接:https://tecdat.cn/?p33760 众所周知,心脏疾病是目前全球最主要的死因。开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器学习可…...
网站被劫持了怎么办
网站被劫持了怎么办 建议新建一个index.html文件,文件中只写几个数字,上传到网站根目录,然后访问网站域名,看看是不是正常,从而可以确定是程序问题还是域名被劫持的问题。 如果是域名被劫持,你可以登录你的…...
【面试题精讲】Java包装类缓存机制
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是 Java 包装类缓存机制? Java 中的包装类(Wrapper Class)是为了将…...
网络相关知识
0 socket SOCK_DGRAM #无连接UDP SOCK_STREAM #面向连接TCP 1 UDP 1.1 检测UDP yum install -y nc 使用netcat测试连通性 服务器端启动 UDP 30003 端口 nc -l -u 30003 客户端连接服务器的30003端口(假设服务的IP地址是119.23.67.12) nc -u 119…...
商品冷启动推荐综述
About Me: LuckBoyPhd/Resume (github.com) (1)一种基于三部图网络的协同过滤算法 推荐系统是电子商务领域最重要的技术之一,而协同过滤算法又是推荐系统用得最广泛的.提出了一种基于加权三部图网络的协同过滤算法,用户、产品及标签都被考虑到算法中,并且研究了标签结点的度对…...

GEO生信数据挖掘(二)下载基因芯片平台文件及注释
检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 下载平台文件 1.AnnotGPL参数改为TRUE,联网下载芯片平台的soft文件。(国内网速奇慢经常中断) 2.手工去GEO官网下载 转换芯片探针ID为gene name 拓…...

淘宝电商必备的大数据应用
在日常生活中,大家总能听到“大数据”“人工智能”的说法。现在的大数据技术应用,从大到巨大科学研究、社会信息审查、搜索引擎,小到社交联结、餐厅推荐等等,已经渗透到我们生活中的方方面面。到底大数据在电商行业可以怎么用&…...

Docker版部署RocketMQ开启ACL验证
一、拉取镜像 docker pull apache/rocketmq:latest 二、准备挂载目录 mkdir /usr/local/rocketmq/data mkdir /usr/local/rocketmq/conf 三、运行 docker run \ -d \ -p 9876:9876 \ -v /usr/local/rocketmq/data/logs:/home/rocketmq/logs \ -v /usr/local/rocketmq/data…...

【RabbitMQ实战】04 RabbitMQ的基本概念:Exchange,Queue,Channel等
一、简介 Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message queuing软件叫做:the information bus(TIB)。 TIB被电信和通讯公司采用,路透…...
APACHE NIFI学习之—RouteOnAttribute
RouteOnAttribute 描述: 使用属性表达式语言根据其属性路由数据流,每个表达式必须返回Boolean类型的值(true或false)。 标签: attributes, routing, Attribute Expression Language, regexp, regex, Regular Expression, Expression Language, 属性, 路由, 表达式, 正则…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...