springBoot统一响应类型3.1版本

ops/2025/3/4 4:01:32/
前言:

通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。

简单回忆:

基础统一响应1.0

java">/*** 基础统一响应类* @param <T>*/@Data
public class apiResult<T> {private int code;private String message;private T data;/*** 带有data返回的构造函数* @param code* @param message* @param data*/public apiResult(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}/*** 不带data的构造函数* @param code* @param message*/public apiResult(int code,String message){this.code = code;this.message = message;}
}

在1.0的基础上,进行优化加工

java">/*** 统一响应类实例化工具*/public class apiResultYOUYA {//http成功状态码private static final int OK = HttpStatus.OK.value();//隔着报错状态码private static int NO = HttpStatus.INTERNAL_SERVER_ERROR.value();//基本成功响应public static <T>apiResult<T> success(T data){return new apiResult<>(OK,"操作成功",data);}//自定义信息成功响应public static <T>apiResult<T> success(String message,T data){return new apiResult<>(OK,message,data);}//基础失败响应public static <T>apiResult<T> error(){return new apiResult<>(NO,"系统错误,请联系管理员");}//自定义信息失败响应public static <T>apiResult<T> error(String message){return new apiResult<>(NO,message);}
}

在1.0,2.0的基础上进行迭代后的全局响应

java">@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {/*** 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)* @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)* @param converterType 自动选择的转换器类型* @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会*/@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//false -> true  用于测试,正式的时需要修改return true;}/*** HttpMessageConverter转换之前进行的操作* @param body 要转换的body* @param returnType 返回类型* @param selectedContentType 根据请求头协商的ContentType* @param selectedConverterType 自动选择的转换器类型* @param request 当前请求* @param response 当前响应* @return 修改后的响应内容*/@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//第二步: 将body传入统一响应工具类中的默认成功响应return apiResultYOUYA.success(body);}
}

3.0完成全局统一响应(无论成功还是失败)

正片:

通过不断的测试,重启,从而发现真理

测试方法:不断修改变量,简称量变产生质变

测试代码

java">@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {/*** 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)* @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)* @param converterType 自动选择的转换器类型* @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会*/@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//false -> true  用于测试,正式的时需要修改return true;}/*** HttpMessageConverter转换之前进行的操作* @param body 要转换的body* @param returnType 返回类型* @param selectedContentType 根据请求头协商的ContentType* @param selectedConverterType 自动选择的转换器类型* @param request 当前请求* @param response 当前响应* @return 修改后的响应内容*/@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//第二步: 将body传入统一响应工具类中的默认成功响应return apiResultYOUYA.success(body);}
}

第一轮测试:删除注解——@ControllerAdvice

测试结果:返回值为api接口类型

对比带有@ControllerAdvice的结果

结论:@ControllerAdvice具有覆盖默认接口类型的作用

我们还原最初的全局配置

java">@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//false -> true  用于测试,正式的时需要修改return false;}@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//第二步: 将body传入统一响应工具类中的默认成功响应return null;}
}

实现接口后的最原始状态

第二轮测试:带有@ControllerAdvice的测试

与删除@ControllerAdvice的测试的无差别

结论:@ControllerAdvice不具有覆盖默认接口类型的作用

第三轮测试:将实现中的boolean support 的返回值 false改为true

java">@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//false -> true  用于测试,正式的时需要修改return true;}@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//第二步: 将body传入统一响应工具类中的默认成功响应return null;}
}

测试结果:无返回值,无响应类型

结论:boolean support 符合真理

真理:当第一个函数 support 的返回值为true,运行第二个函数beforeBodyWrite,当前第二个函数的返回值为null,所以无响应

第四轮测试:保持第三轮测试代码,删除注解@ControllerAdvice

测试结果:

结论:@ControllerAdvice 很重要,没有它,下面的代码无用,@ControllerAdvice提供了对全局统一响应支持

第五轮测试:在第一个函数上打上断点

测试结果:

但是我们可以根据测试找到对应它的作用

这个方法读取了接口的基本信息

第一个参数:返回类型

第二个参数:转换器类型

第一个参数的类型如图

总体来看,返回类型是指api接口的返回类型

第二个参数:

它展示的是MappingJackson2HttpMessageConverter类的具体路径,包

结论:

boolean support的两个形参

第一个参数:returnType 为接口的基本信息

第二个参数:ConverterType为MappingJackson2HttpMessageConverter的基本信息

第六轮测试:给beforBodywrite打上断点

测试过程:

第一步:发送请求至接口

support的形成拿到两个数值

第一个参数:returnType 为api接口的基本信息

第二个参数:ConverterType为MappingJackson2HttpMessageConverter的基本信息

没变化

返回值为ture进行下一步

java">    /*** HttpMessageConverter转换之前进行的操作* @param body 要转换的body* @param returnType 返回类型* @param selectedContentType 根据请求头协商的ContentType* @param selectedConverterType 自动选择的转换器类型* @param request 当前请求* @param response 当前响应* @return 修改后的响应内容*/

默认

我们一条一条对

首先body

和我们的mapper映射后的结果一模一样,换一句话说,它的结果就是我们调用查询数据库后的返回结果,用专业术语叫响应体,不专业的叫查询业务返回值

returnType和support一模一样

selectedContentType

selectedConverterType

翻译:查询内容类型,查询转换器类型

查询转换器类型和support一模一样

也就是说support的两个参数和beforeBodyWrite的一模一样

beforeBodyWrite多了四个参数

分别是响应体,内容类型,请求,响应

第七轮测试        

将响应体作为返回值

java">@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {/*** 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)* @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)* @param converterType 自动选择的转换器类型* @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会*/@Overridepublic boolean supports(MethodParameter returnType,Class<? extends HttpMessageConverter<?>> converterType) {//false -> true  用于测试,正式的时需要修改return true;}/*** HttpMessageConverter转换之前进行的操作* @param body 业务层接口返回值* @param returnType 返回类型* @param selectedContentType 根据请求头协商的ContentType* @param selectedConverterType 自动选择的转换器类型* @param request 当前请求* @param response 当前响应* @return 修改后的响应内容*/@Overridepublic Object beforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//第二步: 将body传入统一响应工具类中的默认成功响应return body;}
}

测试

结论:beforBodyWrite的返回值为控制类的响应体

总结:

@ControllerAdvice提供了对全局统一响应支持

supports与beforBodyWrite相关联


http://www.ppmy.cn/ops/162947.html

相关文章

C++的next_permutation函数与排列问题解法

大家好哇^ _ ^ 火星人问题&#xff08;P1088&#xff09; 一、next_permutation函数解析 1.1 基本定义与特性 next_permutation是C标准库<algorithm>中的全排列生成函数&#xff0c;其核心功能是按照字典序生成给定序列的下一个排列。函数的两种形式&#xff1a; bo…

【Git】Ubuntu 安装 Git Large File Storage(LFS)以及使用 Git LFS 下载

【Git】Ubuntu 安装 Git Large File Storage&#xff08;LFS&#xff09;以及使用 Git LFS 下载 1 安装1.1 使用脚本安装1.2 使用 packagecloud 安装 2 使用2.1 下载 1 安装 1.1 使用脚本安装 参考文档: Link 下载安装包: Link 解压安装包 tar -xzvf git-lfs-linux-amd64-v3.…

大白话虚拟 DOM 原理与 diff 算法的实现机制

虚拟 DOM 原理 啥是虚拟 DOM 想象一下&#xff0c;我们要建一座房子&#xff0c;在真正动手盖之前&#xff0c;先在纸上画一个房子的模型&#xff0c;这个模型就相当于虚拟 DOM。在网页开发里&#xff0c;真实的 DOM 就像那座真正的房子&#xff0c;而虚拟 DOM 就是用 JavaSc…

Vue.js Vue 测试工具:Vue Test Utils 与 Jest

Vue.js Vue 测试工具&#xff1a;Vue Test Utils 与 Jest 在 Vue.js 的开发过程中&#xff0c;编写和执行测试是确保应用质量和稳定性的关键步骤。Vue Test Utils 和 Jest 是 Vue.js 官方推荐的测试工具&#xff0c;二者结合使用&#xff0c;可以高效地进行单元测试和集成测试…

【Linux vi文本编辑器使用指南】

Linux vi文本编辑器使用指南 一、模式切换二、启动与退出三、光标移动&#xff08;命令模式&#xff09;四、编辑文本五、查找与替换六、其他实用命令七、示例流程八、学习建议 Linux系统中的 vi&#xff08;及其增强版 vim&#xff09;是一款功能强大的文本编辑器&#xff0…

【Transformer模型学习】第三篇:位置编码

文章目录 0. 前言1. 为什么需要位置编码&#xff1f;2. 如何进行位置编码&#xff1f;3. 正弦和余弦位置编码4. 举个例子4.1 参数设置4.2 计算分母项4.3 计算位置编码4.4 位置编码矩阵 5. 相对位置信息6. 改进的位置编码方式——RoPE6.1 RoPE的核心思想6.2 RoPE的优势 7. 总结 …

Nginx系列05(负载均衡、动静分离)

目录 Nginx 负载均衡 Nginx 动静分离 Nginx 负载均衡 概念&#xff1a;负载均衡是一种将网络流量分摊到多个后端服务器&#xff08;节点&#xff09;上的技术&#xff0c;以提高系统的可用性、性能和可扩展性。通过负载均衡&#xff0c;Nginx 可以根据一定的算法将客户端请求…

基于SpringBoot+Vue的医院挂号管理系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…