【框架篇】统一数据格式返回

news2024/11/25 12:56:19

✅作者简介:大家好,我是小杨
📃个人主页:「小杨」的csdn博客

🐳希望大家多多支持🥰一起进步呀!


1,统一数据格式返回的介绍

统一数据返回是指在进行接口开发时对返回数据进行规范和统一处理,确保返回数据的格式和结构保持一致。

可以通过使用@ControllerAdvice注解结合ResponseBodyAdvice接口实现统一的数据返回格式。

  • @ControllerAdvice注解用于定义一个全局通知的类,可以用于定义一些全局处理逻辑,例如异常处理、数据绑定、数据格式化等。该注解声明的类可以包含异常处理方法、绑定前和绑定后的拦截方法,以及其他的通用处理逻辑。
  • ResponseBodyAdvice接口是Spring框架提供的一个拦截响应体的接口,它可以在响应体返回给客户端之前对响应数据进行处理。通过实现该接口,在拦截器中可以对数据进行统一的封装、格式化或加工,以实现统一的数据返回格式。

2,统一数据格式返回的实现流程

1,创建一个统一数据返回处理类

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
}

2,ResponseBodyAdvice 中两个方法重写

2.1,supports方法重写

image-20230906153758709

注意:该方法表示是否执行后续的beforeBodyWrite方法,该方法默认返回false,表示不进行后续的代码操作,也就是数据的加工处理,而返回true,才会执行后续的beforeBodyWrite方法。

2.2,beforeBodyWrite方法重写

image-20230906154658819

注意:该方法实现返回数据格式的重写,让其返回统一的数据格式。


3,统一数据格式返回的实现代码

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 在这里可以根据条件判断是否需要对响应体进行处理
        // 这里直接返回 true 表示对所有请求的响应体进行处理
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        // 在这里对响应体进行处理,可以进行封装、格式化等操作
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",200);
        result.put("msg","");
        result.put("data",body);
        // 返回处理后的数据
        return result;
    }
}

4,统一数据格式返回的实现注意

在统一数据处理时,如果你的统一数据处理方法返回类型是String,返回时会出现报错的情况。

返回时具体的执行流程为:

  1. 方法返回的是String类型。
  2. 执行统一数据返回之前的处理:将String转换为HashMap
  3. HashMap转换为application/json字符串返回给前端。

根据源代码的结论,数据转换的过程中会判断原始数据的类型,并选择相应的消息转换器来进行数据的转换。

  • 如果原始数据的类型为String,则会使用StringHttpMessageConverter进行类型转换。
  • 如果原始数据不是String,则会使用其他合适的HttpMessageConverter进行类型转换。

由于统一数据处理方法返回的是String类型,在第三步中会选择StringHttpMessageConverter进行转换。然而,StringHttpMessageConverter无法直接将HashMap对象直接转换为字符串,因此造成了报错。

注:StringHttpMessageConverter默认情况下将只处理字符串类型的数据,故当使用StringHttpMessageConverter时,无法直接将HashMap对象直接转换为字符串,而HttpMessageConverter可以将HashMap转换为字符串。


为了解决这个问题,可以采取以下方法之一:

  1. 移除StringHttpMessageConverter:在Spring MVC的配置中,可以考虑移除StringHttpMessageConverter,这样就不会再将String类型的返回值视为需要进行JSON转换的对象。可以通过在配置类中重写configureMessageConverters方法来实现:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
        }
    }
    

    注意:这样就会使用默认的HttpMessageConverter来处理返回值,而不会发生类型转换错误。

  2. 单独处理String类型返回值:在统一数据返回之前的处理过程中,可以检查返回值的类型。如果类型为String,则直接返回字符串给前端,而不进行HashMap到JSON的转换。可以通过自定义的统一数据返回处理类来实现:

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Object handleException(Exception ex) {
            if (ex instanceof YourCustomException) {
                // 处理自定义异常逻辑
                return "Your custom error message";
            } else if (ex instanceof AnotherException) {
                // 处理另一个异常逻辑
                return "Another error message";
            } else {
                // 其他异常处理逻辑
                return "Generic error message";
            }
        }
    }
    

    注意:在上述示例中,根据数据类型进行不同的处理,并直接返回相应的字符串给前端。

通过以上方法,可以解决统一数据处理方法返回类型为String导致报错的问题,并根据需要进行特殊处理。请根据具体情况选择适合的解决方案。


结语

这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MogDB/openGauss的三种函数稳定性关键字】

一、ORACLE中的类似的函数稳定性关键字&#xff08;DETERMINISTIC&#xff09; 在ORACLE里&#xff0c;function有着一个DETERMINISTIC参数&#xff0c;它表示一个函数在输入不变的情况下输出是否确定&#xff0c;只要输入的参数一样&#xff0c;返回的结果一定一样的&#xf…

Android Mvp案例解析

目录 后端数据接口数据格式 App客户端布局逻辑主界面布局 M&#xff08;Model&#xff09;V&#xff08;View&#xff09;P&#xff08;Presenter&#xff09;OkhttpRetrofitRxJava网络http请求 Mvp架构-初学者MVP架构的契约者 后端数据接口 接口地址&#xff1a;https://apis.…

APP埋点:页面统计与事件统计

我们平时所说的埋点&#xff0c;可以大致分为两部分&#xff0c;一部分是统计APP页面访问情况&#xff0c;即页面统计&#xff1b;另外一部分是统计APP内的操作行为&#xff0c;及自定义事件统计。 一、页面统计 页面统计&#xff0c;可以统计应用内各个页面的访问次数&#x…

fiddler抓包拦截请求转发到其他地址

使用Fiddler拦截请求转发到指定地址方便于本地调试&#xff0c;不需要进行打包切换地址&#xff0c;可以加快问题的确定修复效果 内容&#xff1a; 1&#xff1a;首先给app进行设置代理抓包内容&#xff0c;给进行 https://blog.csdn.net/qq_43717814/article/details/84317038…

精读《算法题 - 二叉树中的最大路径和》

今天我们看一道 leetcode hard 难度题目&#xff1a;二叉树中的最大路径和。 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点…

Si4010 一款带有MCU SoC RF发射机芯片 无线遥控器

Si4010是一款完全集成的SoC RF发射机&#xff0c;带有嵌入式CIP-51 8051 MCU&#xff0c;专为1GHz以下ISM频带设计。该芯片针对电池供电的应用进行了优化&#xff0c;工作电压为1.8至3.6 V&#xff0c;待机电流小于10 nA的超低电流消耗。高功率放大器可提供高达10 dBm的输出功率…

服务器数据库中了elbie勒索病毒怎么办,elbie勒索病毒解密,数据恢复

网络技术的不断成熟&#xff0c;为企业的生产运营提供了强有力的支撑&#xff0c;但是&#xff0c;随之而来的网络安全威胁也不断增加。云天数据恢复中心陆陆续续接到很多企业的求助&#xff0c;企业的服务器数据库e遭到了elbie勒索病毒攻击&#xff0c;导致企业计算机系统瘫痪…

基于PHP语言的会员系统搭建(Docker版)

1、操作系统 ubuntu22 2、安装Docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -…

【UART】UART QA

UART常见知识点整理 定义&#xff1a;Universal Asynchronous Receiver/Transmitter - 通用异步收发传输器。 特点&#xff1a;速率不快、可全双工、结构上一般由波特率产生器、UART发送器、UART接收器组成&#xff0c;硬件2-3线。 线&#xff1a;RXD&#xff0c;TXD&#xff0…

cordova Xcode打包ios以及发布流程(ionic3适用)

第一步 1、申请iOS证书 2、导入证书到钥匙串 第二步 1、xcode配置iOS证书 1.1用Xcode打开你的项目&#xff08;我的Xcode版本是新版&#xff09; 修改如下图 回到基本信息设置界面&#xff0c;Bundie 这项填写&#xff0c;最先创建的那个appid&#xff0c;跟创建iOS描述文件时选…

操作系统——文件空闲存储的空间管理(王道视频p64)

1.总体概述&#xff1a; 2.存储空间初始化&#xff1a; 3.空闲表法 4.空闲链&#xff1a; &#xff08;1&#xff09;空闲“盘块链”&#xff1a; &#xff08;2&#xff09;空闲“盘区链”&#xff1a; 5.位视图法&#xff1a; &#xff08;1&#xff09;基本结构&#xff1…

Leetcode刷题详解——二叉树剪枝

1. 题目链接&#xff1a;814. 二叉树剪枝 2. 题目描述&#xff1a; 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1&…

【Linux】进程管理命令,了解运维的五大性能监测

目录 一、程序与进程 1、程序是什么&#xff1f; 2、进程是什么&#xff1f;线程是什么&#xff1f;服务是什么&#xff1f; 3、进程的特点 4、进程使用内存的问题 二、运维相关命令学习 命令① ps 静态显示系统的进程 第一种静态查看进程信息&#xff1a;ps aux 第二…

解决若依Ruoyi 插入数据返回1,实现主键回填,返回主键ID

最开始的时候ruoyi 插入数据会返回1&#xff0c;开始以为是id&#xff0c;后来发现返回的逻辑是 0失败&#xff0c;1成功。 即便他利用mybatis设置了如下, useGeneratedKeys"true" keyProperty"id"​​​​​​​<selectKey></selectKey> 如…

【Redis】Redis整合SSMRedis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

目录&#xff1a; 目录 一&#xff0c;SSM整合redis 二&#xff0c;redis注解式缓存 三&#xff0c;Redis中的缓存穿透、雪崩、击穿的原因以及解决方案&#xff08;附图&#xff09; 一&#xff0c;SSM整合redis 1.原因&#xff1a; 整合SSM和Redis可以提升系统的性能、可…

【迁移ORACLE数据到MogDB/openGauss时的字符集问题】

一、问题概述 ORACLE数据库在存储数据的时候&#xff0c;有时候会存在这样一种现象&#xff0c;一张表里的数据&#xff0c;既存在UTF8字符的&#xff0c;也存在GBK字符的&#xff0c;同时还有可能存在乱码数据。 NLS_CHARACTERSET是数据库字符集&#xff0c;NLS_NCHAR_CHARAC…

一键搞定!多个模型结果快速合并成一个三线表,model1、model2、model3。。。

欢迎参加郑老师2023年孟德尔随机化课程即将开始 发表文章后退款&#xff01;郑老师科研统计课程详情 在观察性研究中&#xff0c;我们经常同时构建多个统计模型&#xff0c;不同的模型放入不同的协变量&#xff0c;从零个的单因素回归分析&#xff0c;到多个协变量的回归模型。…

jenkins结合k8s部署动态slave

1、完成k8s连接 在完成jenkins的部署后现安装kubernets的插件 如果jenkins 是部署在k8s集群中只需要填写一下 如果是非本集群的部署则需要填写证书等 cat ./config echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt echo ‘client-certificate-data’ |…

MySQL 排序,分组,Limit的优化策略

目录 1. MySQL 中的两种排序方式 2. 排序优化策略 2.1 对排序字段添加索引 2.2 可以和WHERT字段创建联合索引 2.3 优化 FilerSort 排序方式 3. 分组优化策略 3.1 能WHERE不HAVING 3.2 减少ORDER BY&#xff0c;GROUP BY&#xff0c;DISTINCT 3.3 遵照最左前缀法则 4.…

python 之 正则表达式模块re

文章目录 findall例子&#xff1a;特点和注意事项&#xff1a; match示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; search示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; split示例&#xff1a;参数说明&#xff1a;注意…