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

✅作者简介:大家好,我是小杨
📃个人主页:「小杨」的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 {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 在这里可以根据条件判断是否需要对响应体进行处理// 这里直接返回 true 表示对所有请求的响应体进行处理return true;}@Overridepublic 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 {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);}
    }
    

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

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

    @ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic 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.hqwc.cn/news/162410.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言初学者周冲刺计划】4.3根据输入的行数输出一下图案

目录 1题目&#xff1a; 2解题思路&#xff1a; 3代码&#xff1a; 4运行代码&#xff1a; 5总结&#xff1a; 1题目&#xff1a; 2解题思路&#xff1a; 首先分析题干要求&#xff0c;然后找规律&#xff0c;发现前面空格与行数的规律和A,B递推的规律&#xff0c;然后写代…

java基础练习(使用java实现跨库数据调度ETL)

简介 本文写一篇关于java库与库之间的数据传输&#xff0c;现实生产中可能是通过其他方式完成&#xff0c;在没有架构的基础上使用java实现跨库的数据传送&#xff0c;非常不便利。但是作为练习我觉得确实非常有用&#xff0c;涉及的java知识点相对较多。本文以一个实列讲解&am…

船舶IMO识别码是什么?

船舶编码和编码体系比较多&#xff0c;主要有船舶登记号、船检登记号、船舶呼号、IMO号、船舶MMSI、船体号等。 船舶的IMO Number&#xff08;国际海事组织识别码&#xff0c;下称IMO识别码&#xff09;是独一无二的&#xff0c;相当于船舶的身份证号码&#xff0c;并且此号码…

【Windows】解决电脑可以正常使用微信,但是打不开网页

问题 啊哈 如题&#xff0c;在安装软件的过程中突然就发现浏览器不能用了&#xff0c;但是微信可以正常接发消息。 记录一下解决过程。 解决 1、自动DNS 打开控制面板->网络和Internet->网络和共享中心&#xff0c;点击以太网&#xff0c;找到属性Internet协议4(TCP/…

【聚沙成塔系列】通信笔记知识汇总一

什么是NCO 载波NCO通过控制频率w控制。每次要累加的数字M就是频率控制字。调节M进而控制载波频率。 什么是带宽 3db带宽 常说的3dB带宽&#xff0c;是指在信号功率谱对称的情况下&#xff0c;功率谱密度比信号频谱中心处的峰值下降3dB的两个频率之间的频率范围 工作带宽 工作…

docker部署mysql nginx redis

一.创建网络 # 创建网络 docker network create liming # 查看网络 docker network ls二.部署mysql 删除并重新创建mysql容器&#xff0c;并完成本地目录挂载&#xff1a; 挂载/software/mysql/data到容器内的/var/lib/mysql目录挂载/software/mysql/init到容器内的/docker-…

html将复选框变为圆形样例

html将复选框变为圆形样例 说明目录使用对勾图标实现圆形复选框原复选框html代码及默认样式取消复选框未勾选前的样式新增复选框未勾选前的样式新增复选框勾选后的样式获取复选框选中后的value值 使用CSS样式写对勾图标实现圆形复选框 说明 这里记录下用原生html实现将原复选框…

netty基本用法, 拆包、粘包等常见解决方案,看本文即可,不做原理说明,只进行实战操作

netty的基本用法 完整的介绍了netty最基本的发送byte、string、byteBuf发送接收数据&#xff0c;以及拆包、粘包演示&#xff0c;拆包、粘包的解决方案。看netty的用法只看本篇足以&#xff0c;本篇只说用法&#xff0c;不讲底层原理。 详细demo的git地址 示例的通用代码 客…

【JVM】JDBC案例打破双亲委派机制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 打破双亲委派机制&#xff08;JDBC案例…

LangChain+LLM实战---Embedding、从入门到生产使用

搜索功能已经深入到我们的日常生活中&#xff0c;我们常说“Google一下就知道了”&#xff0c;用户已经开始期望几乎每个应用程序和网站都提供某种类型的搜索功能。随着有效搜索变得越来越相关(双关语)&#xff0c;寻找新的方法和体系结构来改进搜索结果对于架构师和开发人员来…

Linux下yum源配置实战

一、Linux下软件包的管理 1、软件安装方式 ① RPM包管理&#xff08;需要单独解决依赖问题&#xff09; ② YUM包管理&#xff08;需要有网络及YUM仓库的支持&#xff0c;会自动从互联网下载软件&#xff0c;自动解决依赖&#xff09; ③ 源码安装&#xff08;安装过程比较…

SpringBoot整合JUnit

1.创建新项目 说明&#xff1a;创建springboot_04_junit项目&#xff0c;选择对应的版本。 2.接口类 说明&#xff1a;新建BookDao接口。 package com.forever.dao;public interface BookDao {public void save(); }3.实现类 说明&#xff1a; 新建BookDaoImpl实现类。 pa…