当前位置: 首页 > news >正文

【Spring Boot】统一数据返回

目录

  • 统一数据返回
    • 一. 概念
    • 二.实现统一数据返回
      • 2.1 重写responseAdvice方法
      • 2.2 重写beforeBodyWriter方法
    • 三. 特殊类型-String的处理
    • 四. 全部代码

统一数据返回

一. 概念

其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维,简单概括就是在我们进行前后端数据交互的时候,能够让后端的数据进行统一的打包封装,返回给前端,便于前后端的数据处理。

二.实现统一数据返回

其实统一数据返回非常简单,在实现时要加入类注解@ControllerAdvice(这是一个表示控制通知的注解,在接下来的统一异常处理也要运用到),在添加类注解后还要在实现ResponseBodyAdvice接口,然后重写接口的responseAdvice接口和beforeBodyWriter方法即可实现。

  1. 添加类注解@ControllerAdvice,实现接口ResponseBodyAdvice
  2. 重写responseAdvice方法
  3. 重写beforeBodyWriter方法
  4. 特殊数据类型特殊处理(String)

2.1 重写responseAdvice方法

responseAdvice方法如下:
在这里插入图片描述

@Override
public boolean supports(MethodParameter returnType, Class converterType) {return true;
}

可以看到,重写该方法主要返回的是Boolean数据类型,返回false表示不执行统一返回,返回true表示对于所有的数据类型都进行数据统一返回。

supports方法:判断是否要执行beforeBodyWrite方法.true为执行,false不执行.通过该方法可以
选择哪些类或哪些方法的response要进行处理,其他的不进行处理

2.2 重写beforeBodyWriter方法

beforeBodyWriter方法如下:
在这里插入图片描述
beforeBodyWrite方法:对response方法进行具体操作处理

其中的参数body最为重要,如果想要对统一后的数据进行格式的转换,直接转换body的格式就行,因为这里的body代指了所有的数据格式。

三. 特殊类型-String的处理

在经过多次不同的数据类型测试后发现,其它类型就可以顺利返回,而String类型却返回不正确。

对于String的数据类型如果想要返回,我们要先引入ObjectMapper,通过调用ObjeceMapper的writeValueAsString()方法来把body的数据格式给转换成Json格式,然后再次进行统一返回即可。

进行数据转换的代码如下:

private static ObjectMapper mapper = new ObjectMapper();@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType,ServerHttpRequestrequest, ServerHttpResponse response) {//如果返回结果为String类型, 使⽤SpringBoot内置提供的Jackson来实现信息的序列化if (body instanceof String){return mapper.writeValueAsString(Result.success(body));}}

四. 全部代码

import com.example.demo.model.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import
org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@Slf4j
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {private static ObjectMapper mapper = new ObjectMapper();@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType, ServerHttpRequestrequest, ServerHttpResponse response) {//返回结果更加灵活if (body instanceof Result){return body;}//如果返回结果为String类型, 使⽤SpringBoot内置提供的Jackson来实现信息的序列化if (body instanceof String){return mapper.writeValueAsString(Result.success(body));}return Result.success(body);}
}
  1. 方便前端程序员更好的接收和解析后端数据接口返回的数据
  2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回
    的.
  3. 有利于项目统⼀数据的维护和修改.
  4. 有利于后端技术部门的统⼀规范的标准制定,不会出现稀奇古怪的返回内容.

相关文章:

  • vue2+element-ui新增编辑表格+删除行
  • Linux系统常用Conda命令(不断更新!)
  • Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
  • 研0学习Python基础4
  • gda动态调试-cnblog
  • js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
  • 如何查看MCU编译生成的elf(out)文件内容
  • 001 SpringMVC介绍
  • Go语言标准库之log和三方库zap
  • 【基础篇】第5章 Elasticsearch 数据聚合与分析
  • 六西格玛绿带培训如何告别“走过场”?落地生根
  • ‘艾’公益——微笑行动「广安站」为艾祝福,让笑起舞
  • 华为OD面试分享18
  • 【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
  • 机器学习(三)
  • django开发-定时任务的使用
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • vue:响应原理
  • Vue小说阅读器(仿追书神器)
  • XML已死 ?
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 飞驰在Mesos的涡轮引擎上
  • 计算机常识 - 收藏集 - 掘金
  • 经典排序算法及其 Java 实现
  • 聊聊directory traversal attack
  • 微信公众号开发小记——5.python微信红包
  • 详解NodeJs流之一
  • 写代码的正确姿势
  • 追踪解析 FutureTask 源码
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 阿里云服务器如何修改远程端口?
  • # 达梦数据库知识点
  • # 透过事物看本质的能力怎么培养?
  • ###C语言程序设计-----C语言学习(6)#
  • #07【面试问题整理】嵌入式软件工程师
  • (3)llvm ir转换过程
  • (javascript)再说document.body.scrollTop的使用问题
  • (js)循环条件满足时终止循环
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计ssm电影分享网站
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (一)Docker基本介绍
  • (转)创业家杂志:UCWEB天使第一步
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ./configure,make,make install的作用(转)
  • .NET Framework杂记
  • .net 反编译_.net反编译的相关问题
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net6Api后台+uniapp导出Excel
  • .net快速开发框架源码分享
  • 。。。。。
  • @requestBody写与不写的情况
  • @test注解_Spring 自定义注解你了解过吗?
  • @Transactional 竟也能解决分布式事务?