springBoot统一响应类型3.1版本

前言:

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

简单回忆:

基础统一响应1.0

/**
 * 基础统一响应类
 * @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的基础上,进行优化加工

/**
 * 统一响应类实例化工具
 */

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的基础上进行迭代后的全局响应

@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {


    /**
     * 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)
     * @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)
     * @param converterType 自动选择的转换器类型
     * @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会
     */

    @Override
    public 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 修改后的响应内容
     */
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        //第二步: 将body传入统一响应工具类中的默认成功响应
        return apiResultYOUYA.success(body);
    }
}

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

正片:

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

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

测试代码

@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {


    /**
     * 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)
     * @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)
     * @param converterType 自动选择的转换器类型
     * @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会
     */

    @Override
    public 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 修改后的响应内容
     */
    @Override
    public 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具有覆盖默认接口类型的作用

我们还原最初的全局配置

@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
        //false -> true  用于测试,正式的时需要修改
        return false;
    }
    @Override
    public 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

@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
        //false -> true  用于测试,正式的时需要修改
        return true;
    }
    @Override
    public 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进行下一步

    /**
     * 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多了四个参数

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

第七轮测试        

将响应体作为返回值

@ControllerAdvice
public class GlobalApiResult implements ResponseBodyAdvice<Object> {

    /**
     * 此Advice是否使用于该返回类型和Converter类型(意思是可以配置多个哦)
     * @param returnType 返回类型(这里可以获取很多东西, 别被名字误导了)
     * @param converterType 自动选择的转换器类型
     * @return 返回true表示将会走接下来的方法(beforeBodyWrite), 否则不会
     */
    @Override
    public 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 修改后的响应内容
     */
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        //第二步: 将body传入统一响应工具类中的默认成功响应
        return body;
    }
}

测试

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

总结:

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

supports与beforBodyWrite相关联

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDD 架构之领域驱动设计【通俗易懂】

文章目录 1. 前言2. MVC 对比 DDD3. DDD 分层架构4. 完整业务流程 1. 前言 官方回答&#xff1a;DDD是一种应对复杂业务系统的设计方法&#xff0c;通过将软件设计与业务领域紧密结合&#xff0c;帮助开发人员构建清晰、可维护的领域模型。在复杂的业务系统中&#xff0c;它能…

LeetCode 889.根据前序和后序遍历构造二叉树

题目&#xff1a; 给定两个整数数组&#xff0c;preorder 和 postorder &#xff0c;其中 preorder 是一个具有 无重复 值的二叉树的前序遍历&#xff0c;postorder 是同一棵树的后序遍历&#xff0c;重构并返回二叉树。 如果存在多个答案&#xff0c;您可以返回其中 任何 一…

SSM共享充电宝系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…

Android 常用命令和工具解析之存储相关

1 基本概念 2 命令解读 2.1 adb shell df df 命令主要用于需要检查文件系统上已使用和可用的磁盘空间的数量。如果没有指定文件名&#xff0c;则显示在当前所有挂载的文件系统上可用的空间。其原理是从proc/mounts 或 /etc/mtab 中检索磁盘信息。 注意&#xff1a;df命令并…

51单片机编程学习笔记——LED原理图

大纲 概览LED电路图Resistor Pack3位数电阻表示法VCC 在《51单片机编程学习笔记——编译代码点亮LED》一文中&#xff0c;我们通过下面这段代码点亮了D1和D2两个LED灯。 sbit LED1P2^0; //将P2.0管脚定义为LED1 sbit LED2P2^1; //将P2.1管脚定义为LED2 …… LED10; LED20;那么…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

vue3+ts实现动态下拉选项为图标

功能&#xff1a;实现可配置项&#xff0c;下拉选项为图标&#xff0c;如图&#xff1a; 代码如下&#xff1a; <el-select v-model"BuyVolAcc" size"small" style"width: 100%" class"icon-selector"><el-option v-for&qu…

C语言(15)-------------->一维数组

这篇文章介绍的是数组的定义、创建、初始化、使用&#xff0c;在数组中输入内容并输出数组中的内容&#xff0c;并探讨了数组在内存中的存储。里面有些内容建议大家参考下面的一些文章&#xff0c;有助于加深大家对于C语言的理解&#xff1a; C语言&#xff08;2&#xff09;-…

RISCV指令集解析

参考视频&#xff1a;《RISC-V入门&进阶教程》1-4-RV32I基本指令集&#xff08;1&#xff09;_哔哩哔哩_bilibili privilege是特权指令集&#xff0c;有点系统调用的感觉&#xff0c;要走内核态。unprivilege指令集有点像普通的函数调用。

2.27 链表中等 817

817. Linked List Components class Solution { public:int numComponents(ListNode* head, vector<int>& nums) {// 将 nums 存储到一个 unordered_set 中&#xff0c;方便 O(1) 查找unordered_set<int> numSet(nums.begin(), nums.end());int count 0;bool …

NFC拉起微信小程序申请URL scheme 汇总

NFC拉起微信小程序&#xff0c;需要在微信小程序开发里边申请 URL scheme &#xff0c;审核通过后才可以使用NFC标签碰一碰拉起微信小程序 有不少人被难住了&#xff0c;从微信小程序开发社区汇总了以下信息&#xff0c;供大参考 第一&#xff0c;NFC标签打开小程序 https://de…

rustdesk远程桌面自建服务器

首先&#xff0c;我这里用到的是阿里云服务器 centos7版本&#xff0c;win版客户端。 准备工作 centos7 服务器端文件&#xff1a; https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-linux-amd64.zip win版客户端安装包&#xff1…

ERROR “GET /mobiles/13344444444/count/ HTTP/1.1“ 500 63503

背景&#xff1a; 美多的&#xff0c;这个问题我不知道那个老师为啥没讲&#xff0c;我直接去看了他的源码发现可恶&#xff0c;直接啥也没有&#xff0c;关键是他竟然跑的通 早知道用postman代替这个该死的刷新就好了&#xff0c;我写了差不多20多次 view.py的 class Mobile…

LabVIEW 项目长时间稳定运行注意事项

利用 LabVIEW 开发的上位机显示界面通过网络与数字板实现数据通讯&#xff0c;运行一周左右会出现一次数据掉线&#xff08;数据采集不上来&#xff09;&#xff0c;需重新 Connect 才能恢复的问题。 出现这种情况&#xff0c;可能是以下几方面原因导致&#xff1a; 网络通讯方…

MYSQL学习笔记(十):约束介绍(如:非空、唯一、主键、外键、级联、默认、检查约束)

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇讲解“约束”&#xff0c;如&#xff1a;非空、唯一、主键、外键、级联、默认…

打印九九乘法表

打印九九乘法表 package struct; ​ public class ForDemo04 {public static void main(String[] args) { ​for (int i 1; i < 9; i) {//System.out.println(1"*"i""(1*i));for (int j 1; j < i; j) {System.out.print(i"*"j"&qu…

实时时钟(RTC)/日历芯片PCF8563的I2C读写驱动(2):功能介绍

0 参考资料 PCF8563数据手册&#xff08;第 11 版——2015 年 10 月 26 日&#xff09;.pdf 1 功能介绍 1.1 实时时钟&#xff08;RTC&#xff09;/日历 &#xff08;1&#xff09;PCF8563支持实时时钟&#xff08;RTC&#xff09;&#xff0c;提供时、分、秒信息。对应寄存器…

Hadoop完全分布式安装配置

Hadoop完全分布式安装配置 Hadoop完全分布式安装配置 使用的三台主机名称分别为bigdata1&#xff0c;bigdata2&#xff0c;bigdata3。所使用的安装包名称按自己的修改&#xff0c;安装包可去各大官网上下载* 一.JDK: 1.解压&#xff1a; tar -zxvf /opt/software/jdk-8u212…

TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整

2025年春节假期已过&#xff0c;大家都带着慢慢的活力回到了工作岗位。为了让大家在新的一年继续感受到 Tiny Engine 的成长与变化&#xff0c;我们很高兴地宣布&#xff1a;TinyEngine v2.2版本正式发布&#xff01;本次更新带来了重要的功能增强------页面支持嵌套路由&#…

图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)

本文主要介绍了灰度直方图相关的处理&#xff0c;包括以下几个方面的内容&#xff1a; • 利用OpenCV计算图像的灰度直方图&#xff0c;并绘制直方图曲线 • 直方图均衡化的原理及实现 • 直方图规定化&#xff08;匹配&#xff09;的原理及实现 图像的灰度直方图 一…