Spring - 统一返回数据格式


T04BF
👋专栏: 算法|JAVA|MySQL|C语言
🫵 今天你敲代码了吗

文章目录

      • [1. 使用](#1. 使用)
      • [2. 字符串问题](#2. 字符串问题)
        • [2.1 解决方法:](#2.1 解决方法:)
        • [2.2 问题分析](#2.2 问题分析)

有时候后端返回的响应可能是String,Boolean之类的类型,但是我们希望响应将可能描述清除,如失败的原因等

由于一次只能返回一个对象,因此就要将返回结果封装起来

java 复制代码
@Data
public class Result<T> {
    private ResultCodeEnum code;
    private String msg;
    private T data;


    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(ResultCodeEnum.SUCCESS);
        result.setMsg("成功");
        result.setData(data);
        return result;
    }

    public static <T> Result<T> fail(String errMsg) {
        Result result = new Result();
        result.setCode(ResultCodeEnum.FAIL);
        result.setMsg(errMsg);
        result.setData(null);
        return result;
    }



    public static <T> Result<T> paramError() {
        Result result = new Result();
        result.setCode(ResultCodeEnum.ParamERROR);
        result.setMsg("参数错误");
        result.setData(null);
        return result;
    }
}

但是对于每个请求的响应,都要进行这样的封装,就会很麻烦

Spring提供了统一返回数据格式的功能

1. 使用

统一返回的数据格式使用@ControllerAdvice,

实现类ResponseBodyAdvice接口

java 复制代码
@ControllerAdvice
public class ResponseAdvice 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) {
        return Result.success(body);
    }
}
  • supports方法:判断是否要执行beforeBodyWrite方法.true为执行,false就不执行,可以从returnType中获取类名和方法名,可以选择哪些类或哪些方法的Response要进行处理
  • beforeBodyWrite:对Response方法进行具体的操作处理

2. 字符串问题

如果我们的接口是这样的

此时访问:

看到日志:

提到Result不能被映射到String

2.1 解决方法:
java 复制代码
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    if(body instanceof String){
        try {
            if("SUCCESS".equals(body)){
                response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
                return objectMapper.writeValueAsString(Result.success(body));
            }else {
                return objectMapper.writeValueAsString(Result.paramError());
            }
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
    return Result.success(body);
}

就是要对String的返回类型进行特殊处理,转成JSON字符串

2.2 问题分析

参考博客:关于Spring统一返回数据格式中String的问题


感谢您的访问!!期待您的关注!!!


T04BF
🫵 今天记得敲代码

相关推荐
逝水无殇1 小时前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚2 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123453 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑4 小时前
Sentinel安装
java·后端·微服务
IT_陈寒4 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_4924 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端
逝水无殇4 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
YIAN4 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
小兔崽子去哪了5 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构