0


【Spring Boot】统一数据返回,直接使用

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

【Spring Boot】统一数据返回

在Web应用程序开发中,统一数据返回格式对于前后端分离项目尤为重要。通过统一的数据返回格式,可以大大简化前端数据解析的复杂度,提高代码的可维护性和一致性。本文将介绍如何在Spring Boot项目中实现统一的数据返回格式。

一、概念

统一数据返回指的是将所有接口的返回数据进行统一封装,使用一致的格式返回给前端。例如,可以定义一个标准的响应格式,包括状态码、消息、数据等信息:

{"code":200,"message":"Success","data":{...}}

通过这种方式,前端开发人员只需处理一种响应格式,减少解析错误和代码冗余。

二、实现统一数据返回

为了实现统一的数据返回格式,我们可以使用Spring Boot的

ResponseBodyAdvice

接口,该接口可以在响应返回之前对响应体进行处理。

2.1 重写responseAdvice方法

首先,我们需要创建一个类,实现

ResponseBodyAdvice

接口,并重写其中的方法:

importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvicepublicclassGlobalResponseAdviceimplementsResponseBodyAdvice<Object>{@Overridepublicbooleansupports(MethodParameter returnType,Class converterType){returntrue;}@OverridepublicObjectbeforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest request,ServerHttpResponse response){if(body instanceofResponseEntity){return body;}returnnewApiResponse(200,"Success", body);}}

在上面的代码中,

supports

方法用于判断哪些接口的返回值需要处理,这里返回

true

表示处理所有接口的返回值。

beforeBodyWrite

方法则是在响应体写入之前进行处理,将返回的数据封装为统一格式的

ApiResponse

对象。

2.2 实现ApiResponse类

创建

ApiResponse

类,用于定义统一的响应格式:

publicclassApiResponse<T>{privateint code;privateString message;privateT data;publicApiResponse(int code,String message,T data){this.code = code;this.message = message;this.data = data;}// Getters and Setters}
三、特殊类型-String的处理

由于Spring在处理

String

类型的返回值时,会直接将其写入响应体,而不会经过

HttpMessageConverter

,因此我们需要对

String

类型进行特殊处理:

importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvicepublicclassGlobalResponseAdviceimplementsResponseBodyAdvice<Object>{privatefinalObjectMapper objectMapper;publicGlobalResponseAdvice(ObjectMapper objectMapper){this.objectMapper = objectMapper;}@Overridepublicbooleansupports(MethodParameter returnType,Class<?extendsHttpMessageConverter<?>> converterType){returntrue;}@OverridepublicObjectbeforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<?extendsHttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response){if(body instanceofString){try{return objectMapper.writeValueAsString(newApiResponse<>(200,"Success", body));}catch(Exception e){thrownewRuntimeException("Failed to write response as String", e);}}if(body instanceofResponseEntity){return body;}returnnewApiResponse<>(200,"Success", body);}}

在上面的代码中,我们使用

ObjectMapper

ApiResponse

对象转换为

String

,确保

String

类型的返回值也能统一为标准格式。

四、全部代码
// ApiResponse.javapublicclassApiResponse<T>{privateint code;privateString message;privateT data;publicApiResponse(int code,String message,T data){this.code = code;this.message = message;this.data = data;}// Getters and Setters}// GlobalResponseAdvice.javaimportcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework.http.ResponseEntity;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvicepublicclassGlobalResponseAdviceimplementsResponseBodyAdvice<Object>{privatefinalObjectMapper objectMapper;publicGlobalResponseAdvice(ObjectMapper objectMapper){this.objectMapper = objectMapper;}@Overridepublicbooleansupports(MethodParameter returnType,Class<?extendsHttpMessageConverter<?>> converterType){returntrue;}@OverridepublicObjectbeforeBodyWrite(Object body,MethodParameter returnType,MediaType selectedContentType,Class<?extendsHttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response){if(body instanceofString){try{return objectMapper.writeValueAsString(newApiResponse<>(200,"Success", body));}catch(Exception e){thrownewRuntimeException("Failed to write response as String", e);}}if(body instanceofResponseEntity){return body;}returnnewApiResponse<>(200,"Success", body);}}

通过上述代码,我们可以实现Spring Boot项目中统一的数据返回格式。无论返回的数据类型如何,都可以通过统一封装后的格式返回给前端,极大地提高了代码的可维护性和前后端的开发效率。

在这里插入图片描述

标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/weixin_44976692/article/details/140228961
版权归原作者 码农阿豪@新空间代码工作室 所有, 如有侵权,请联系我们删除。

“【Spring Boot】统一数据返回,直接使用”的评论:

还没有评论