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

2024-07-11 1005阅读

个人名片

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

🎓作者简介:java领域优质创作者

🌐个人主页:码农阿豪

📞工作室:新空间代码工作室(提供各种软件服务)

💌个人邮箱:[2435024119@qq.com]

📱个人微信:15279484656

🌐个人导航网站:www.forff.top

💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

    码农阿豪系列专栏导航

    面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️

    Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻

    Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡

    全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

    目录

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

              【Spring Boot】统一数据返回

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

              一、概念

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

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

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

              二、实现统一数据返回

              为了实现统一的数据返回格式,我们可以使用Spring Boot的ResponseBodyAdvice接口,该接口可以在响应返回之前对响应体进行处理。

              2.1 重写responseAdvice方法

              首先,我们需要创建一个类,实现ResponseBodyAdvice接口,并重写其中的方法:

              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;
              @ControllerAdvice
              public class GlobalResponseAdvice implements ResponseBodyAdvice {
                  @Override
                  public boolean supports(MethodParameter returnType, Class converterType) {
                      return true;
                  }
                  @Override
                  public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                                Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
                      if (body instanceof ResponseEntity) {
                          return body;
                      }
                      return new ApiResponse(200, "Success", body);
                  }
              }
              

              在上面的代码中,supports方法用于判断哪些接口的返回值需要处理,这里返回true表示处理所有接口的返回值。beforeBodyWrite方法则是在响应体写入之前进行处理,将返回的数据封装为统一格式的ApiResponse对象。

              2.2 实现ApiResponse类

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

              public class ApiResponse {
                  private int code;
                  private String message;
                  private T data;
                  public ApiResponse(int code, String message, T data) {
                      this.code = code;
                      this.message = message;
                      this.data = data;
                  }
                  // Getters and Setters
              }
              
              三、特殊类型-String的处理

              由于Spring在处理String类型的返回值时,会直接将其写入响应体,而不会经过HttpMessageConverter,因此我们需要对String类型进行特殊处理:

              import com.fasterxml.jackson.databind.ObjectMapper;
              import org.springframework.core.MethodParameter;
              import org.springframework.http.MediaType;
              import org.springframework.http.converter.HttpMessageConverter;
              import org.springframework.http.server.ServerHttpRequest;
              import org.springframework.http.server.ServerHttpResponse;
              import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
              @ControllerAdvice
              public class GlobalResponseAdvice implements ResponseBodyAdvice {
                  private final ObjectMapper objectMapper;
                  public GlobalResponseAdvice(ObjectMapper objectMapper) {
                      this.objectMapper = objectMapper;
                  }
                  @Override
                  public boolean supports(MethodParameter returnType, Class> converterType) {
                      return true;
                  }
                  @Override
                  public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                                Class> selectedConverterType, 
                                                ServerHttpRequest request, ServerHttpResponse response) {
                      if (body instanceof String) {
                          try {
                              return objectMapper.writeValueAsString(new ApiResponse(200, "Success", body));
                          } catch (Exception e) {
                              throw new RuntimeException("Failed to write response as String", e);
                          }
                      }
                      if (body instanceof ResponseEntity) {
                          return body;
                      }
                      return new ApiResponse(200, "Success", body);
                  }
              }
              

              在上面的代码中,我们使用ObjectMapper将ApiResponse对象转换为String,确保String类型的返回值也能统一为标准格式。

              四、全部代码
              // ApiResponse.java
              public class ApiResponse {
                  private int code;
                  private String message;
                  private T data;
                  public ApiResponse(int code, String message, T data) {
                      this.code = code;
                      this.message = message;
                      this.data = data;
                  }
                  // Getters and Setters
              }
              // GlobalResponseAdvice.java
              import com.fasterxml.jackson.databind.ObjectMapper;
              import org.springframework.core.MethodParameter;
              import org.springframework.http.MediaType;
              import org.springframework.http.ResponseEntity;
              import org.springframework.http.converter.HttpMessageConverter;
              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;
              @ControllerAdvice
              public class GlobalResponseAdvice implements ResponseBodyAdvice {
                  private final ObjectMapper objectMapper;
                  public GlobalResponseAdvice(ObjectMapper objectMapper) {
                      this.objectMapper = objectMapper;
                  }
                  @Override
                  public boolean supports(MethodParameter returnType, Class> converterType) {
                      return true;
                  }
                  @Override
                  public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                                Class> selectedConverterType, 
                                                ServerHttpRequest request, ServerHttpResponse response) {
                      if (body instanceof String) {
                          try {
                              return objectMapper.writeValueAsString(new ApiResponse(200, "Success", body));
                          } catch (Exception e) {
                              throw new RuntimeException("Failed to write response as String", e);
                          }
                      }
                      if (body instanceof ResponseEntity) {
                          return body;
                      }
                      return new ApiResponse(200, "Success", body);
                  }
              }
              

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]