SpringBoot统一数据返回的几种方式

 更新时间:2024年07月19日 09:35:55   作者:码农阿豪@新空间代码工作室  
在Web应用程序开发中,统一数据返回格式对于前后端分离项目尤为重要,本文就来介绍一下SpringBoot统一数据返回的几种方式,具有一定的参考价值,感兴趣的可以了解一下

在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<Object> {

    @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<T> {

    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<Object> {

    private final ObjectMapper objectMapper;

    public GlobalResponseAdvice(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                  Class<? extends HttpMessageConverter<?>> 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);
    }
}

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

四、全部代码

// ApiResponse.java
public class ApiResponse<T> {

    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<Object> {

    private final ObjectMapper objectMapper;

    public GlobalResponseAdvice(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                  Class<? extends HttpMessageConverter<?>> 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项目中统一的数据返回格式。无论返回的数据类型如何,都可以通过统一封装后的格式返回给前端,极大地提高了代码的可维护性和前后端的开发效率。

到此这篇关于SpringBoot统一数据返回的几种方式的文章就介绍到这了,更多相关SpringBoot统一数据返回内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • kotlin基础教程之类和继承

    kotlin基础教程之类和继承

    这篇文章主要介绍了kotlin基础教程之类和继承的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java多线程并发开发之DelayQueue使用示例

    Java多线程并发开发之DelayQueue使用示例

    这篇文章主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Maven中的SnapShot版本和正式版本的区别

    Maven中的SnapShot版本和正式版本的区别

    在Nexus仓库中,一个仓库一般分为public(Release)仓和SNAPSHOT仓,本文详细的介绍了SnapShot版本和正式版本的区别,感兴趣的可以了解一下
    2021-06-06
  • Spring Boot Hello World的实现代码

    Spring Boot Hello World的实现代码

    这篇文章主要介绍了Spring Boot Hello World的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 使用Java如何对复杂的数据类型排序和比大小

    使用Java如何对复杂的数据类型排序和比大小

    我相信大家在第一次接触算法的时候,最先接触的肯定也是从排序算法开始的,下面这篇文章主要给大家介绍了关于使用Java如何对复杂的数据类型排序和比大小的相关资料,需要的朋友可以参考下
    2023-12-12
  • java线程并发blockingqueue类使用示例

    java线程并发blockingqueue类使用示例

    BlockingQueue是一种特殊的Queue,若BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒,下面是用BlockingQueue来实现Producer和Consumer的例子
    2014-01-01
  • springboot实现拦截器的3种方式及异步执行的思考

    springboot实现拦截器的3种方式及异步执行的思考

    实际项目中,我们经常需要输出请求参数,响应结果,方法耗时,统一的权限校验等。本文首先为大家介绍 HTTP 请求中三种常见的拦截实现,并且比较一下其中的差异。感兴趣的可以了解一下
    2021-07-07
  • Java字典生成算法讲解

    Java字典生成算法讲解

    今天小编就为大家分享一篇关于Java字典生成算法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java利用哈夫曼编码实现字符串压缩

    Java利用哈夫曼编码实现字符串压缩

    赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法。本文将利用哈夫曼树实现哈夫曼编码进行字符串压缩,需要的可以参考一下
    2022-09-09
  • JavaWeb实现学生信息管理系统(1)

    JavaWeb实现学生信息管理系统(1)

    这篇文章主要为大家详细介绍了JavaWeb实现学生信息管理系统第一篇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论