【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, 属性, 路由, 表达式, 正则…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
