个人名片
🎓作者简介: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项目中统一的数据返回格式。无论返回的数据类型如何,都可以通过统一封装后的格式返回给前端,极大地提高了代码的可维护性和前后端的开发效率。

版权归原作者 码农阿豪@新空间代码工作室 所有, 如有侵权,请联系我们删除。
