【Spring Boot】统一数据返回

目录
  • 统一数据返回
    • [一. 概念](#一. 概念)
    • 二.实现统一数据返回
      • [2.1 重写responseAdvice方法](#2.1 重写responseAdvice方法)
      • [2.2 重写beforeBodyWriter方法](#2.2 重写beforeBodyWriter方法)
    • [三. 特殊类型-String的处理](#三. 特殊类型-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();
		
	@Override
	public boolean supports(MethodParameter returnType, Class converterType) {
		return true;
	}
	
	@SneakyThrows
	@Override
	public Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest
	request, 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. 有利于后端技术部门的统规范的标准制定,不会出现稀奇古怪的返回内容.
相关推荐
IT_陈寒21 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro1 天前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax1 天前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH1 天前
Koa和Express的区别
后端
MariaH1 天前
Koa框架的使用
后端
luckdewei1 天前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某1 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy1 天前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom1 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java