码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spring Boot 统一数据返回格式


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


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

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

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

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

    2.1 创建统一响应类

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

    1. public class ApiResponse {
    2. private int status;
    3. private String message;
    4. private T data;
    5. public ApiResponse(int status, String message, T data) {
    6. this.status = status;
    7. this.message = message;
    8. this.data = data;
    9. }
    10. // Getters and Setters
    11. }

    2.2 创建统一响应处理类

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

    1. @ControllerAdvice
    2. public class GlobalResponseBodyAdvice implements ResponseBodyAdvice {
    3. @Override
    4. public boolean supports(MethodParameter returnType, Class converterType) {
    5. // 判断是否需要处理响应体
    6. return true;
    7. }
    8. @Override
    9. public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
    10. Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    11. // 包装响应体
    12. if (body instanceof ApiResponse) {
    13. return body;
    14. }
    15. return new ApiResponse<>(HttpStatus.OK.value(), "Success", body);
    16. }
    17. }
    18. 为了保证异常也能返回统一的数据格式,我们需要创建一个全局异常处理类,博客 讲解了Spring Boot中如何进行统一异常处理。

      1. @ControllerAdvice //添加完此注解后,此类随着springboot项目的启动而启动,并且会监控controller的异常.监听项目中所有的异常
      2. @ResponseBody
      3. public class MyExceptionAdvice {
      4. //这里的一场都是意外异常,并不是业务异常,业务异常后端controller会处理返回给前端.业务异常会和前端沟通好已规定的状态码返回。
      5. @ExceptionHandler(NullPointerException.class)
      6. public ApiResponse doNullPointerException(NullPointerException e){
      7. ApiResponse apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null);
      8. return apiResponse;
      9. }
      10. // 默认的异常处理,当有有异常出现的时候,会先匹配子类的异常,当所有的异常都没有匹配的时候就会走这一条默认的一场路线业务。
      11. @ExceptionHandler(Exception.class)
      12. public ApiResponse doException(Exception e){
      13. ApiResponse apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null);
      14. return apiResponse;
      15. }
      16. }

      2.3 controller模拟数据并返回

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

      1. @RestController
      2. @RequestMapping("/user")
      3. public class UserController {
      4. @RequestMapping("login")
      5. public String login(){
      6. Object obj = null;
      7. System.out.println(obj.hashCode());
      8. return "这里是login";
      9. }
      10. @GetMapping("/data")
      11. public User getUserData() {
      12. // 这个方法会返回一个User对象
      13. User user = new User();
      14. user.setId(1);
      15. user.setName("张三");
      16. user.setEmail("zhangsan@example.com");
      17. return user;
      18. }
      19. @GetMapping("/success")
      20. public Integer getSuccessMessage() {
      21. // 这个方法会返回一个简单的字符串
      22. return 123456;
      23. }
      24. }

      访问: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响应格式一致,更加规范和易于维护。

    19. 相关阅读:
      华为年薪千万的大牛机器视觉搞了几十年,没有搞定的定位算法,现在我开源给大家。用于非标自动化行业。
      PPP协议和HDLC协议
      【前端之旅】Axios看这一篇就够了
      java毕业设计房屋档案信息管理Mybatis+系统+数据库+调试部署
      压缩状态DP位运算
      前端基础建设与架构01 npm 安装机制及企业级部署私服原理
      AI绘画初体验(6pen平台)
      72_Pandas.DataFrame保存并读取带pickle的系列(to_pickle、read_pickle)
      洋葱集团携手OceanBase实现分布式升级,全球数据首次实现跨云融合
      Linux|centos7 Prometheus的自动服务发现 一(文件发现机制)
    20. 原文地址:https://blog.csdn.net/qq_45875349/article/details/139251173
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号