Spring Boot 统一数据返回格式

在 Spring Boot 项目中,统一的数据格式返回是一种良好的实践,它提高了代码的可维护性和一致性,并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。


1 为什么需要统一数据返回格式

  1. ⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。
  2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就⾏了,因为所有接⼝都是这样返回的。
  3. 有利于项⽬统⼀数据的维护和修改。
  4. 有利于后端技术部⻔的统⼀规范的标准制定,不会出现稀奇古怪的返回内容。

2 统一数据返回格式的实现

统⼀的数据返回格式可以使⽤ @ControllerAdvice + ResponseBodyAdvice 的⽅式实现。

  • @ControllerAdvice是Spring框架提供的一个用于全局处理控制器的增强器注解。通过@ControllerAdvice注解的类,可以将对应的增强逻辑应用到所有的@Controller注解的控制器中。
  • @ResponseBodyAdvice是一个用于处理响应体的接口。通过实现这个接口,可以在Controller方法返回之前和之后对响应体进行处理。

具体实现如下:

2.1 创建统一响应类

首先,我们需要创建一个统一的响应类,用于封装 API 返回的数据:

java 复制代码
public class ApiResponse<T> {
    private int status;
    private String message;
    private T data;

    public ApiResponse(int status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    // Getters and Setters
}

2.2 创建统一响应处理类

这里使用@controller注解和ResponseBodyAdvice来实现

java 复制代码
@ControllerAdvice
public class GlobalResponseBodyAdvice 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 ApiResponse) {
            return body;
        }
        return new ApiResponse<>(HttpStatus.OK.value(), "Success", body);
    }
}

为了保证异常也能返回统一的数据格式,我们需要创建一个全局异常处理类,博客 讲解了Spring Boot中如何进行统一异常处理。

java 复制代码
@ControllerAdvice //添加完此注解后,此类随着springboot项目的启动而启动,并且会监控controller的异常.监听项目中所有的异常
@ResponseBody
public class MyExceptionAdvice {

    //这里的一场都是意外异常,并不是业务异常,业务异常后端controller会处理返回给前端.业务异常会和前端沟通好已规定的状态码返回。
    @ExceptionHandler(NullPointerException.class)
    public ApiResponse<String> doNullPointerException(NullPointerException e){
        ApiResponse<String> apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null);
        return apiResponse;
    }

    // 默认的异常处理,当有有异常出现的时候,会先匹配子类的异常,当所有的异常都没有匹配的时候就会走这一条默认的一场路线业务。
    @ExceptionHandler(Exception.class)
    public ApiResponse<String> doException(Exception e){
        ApiResponse<String> apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null);
        return apiResponse;
    }
}

2.3 controller模拟数据并返回

观察异常出现情况下和正常访问情况下,是否都实现了统一格式返回。

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("login")
    public String login(){
        Object obj = null;
        System.out.println(obj.hashCode());
        return  "这里是login";
    }

    @GetMapping("/data")
    public User getUserData() {
        // 这个方法会返回一个User对象
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setEmail("zhangsan@example.com");
        return user;
    }

    @GetMapping("/success")
    public Integer getSuccessMessage() {
        // 这个方法会返回一个简单的字符串
        return 123456;
    }
}

访问:127.0.0.1:8080/user/login 可以看到异常信息被统一处理并统一格式后返回。

访问127.0.0.1:8080/user/data ,可以看到接收到的数据也被统一处理。

访问127.0.0.1:8080/user/success ,可以看到接收到的数据也被统一处理。


总结

通过上述步骤,我们实现了使用@ControllerAdvice和ResponseBodyAdvice统一API数据返回格式的功能。这种方式不仅简化了代码,还使得API响应格式一致,更加规范和易于维护。

相关推荐
小张认为的测试10 分钟前
Liunx上Jenkins 持续集成 Java + Maven + TestNG + Allure + Rest-Assured 接口自动化项目
java·ci/cd·jenkins·maven·接口·testng
深蓝海拓18 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
蘑菇丁40 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
呼啦啦啦啦啦啦啦啦2 小时前
【Redis】持久化机制
java·redis·mybatis
C嘎嘎嵌入式开发2 小时前
什么是僵尸进程
服务器·数据库·c++
我想学LINUX3 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
Yeats_Liao4 小时前
Navicat 导出表结构后运行查询失败ERROR 1064 (42000): You have an error in your SQL syntax;
数据库·sql
明月看潮生5 小时前
青少年编程与数学 02-007 PostgreSQL数据库应用 15课题、备份与还原
数据库·青少年编程·postgresql·编程与数学
明月看潮生5 小时前
青少年编程与数学 02-007 PostgreSQL数据库应用 14课题、触发器的编写
数据库·青少年编程·postgresql·编程与数学