文章目录
- 1、简介
- 2、实战案例
- 2.1 定义统一的返回结果类
- 2.2 写个简单的测试方法
- 2.3 定义Controller接口
- 2.4 定义自定义注解
- 2.5 自定义ResponseBodyAdvice
- 2.6 进行测试
- 3、注意事项
环境:SpringBoot3.3.4
1、简介
在构建基于Spring Boot
的Restful API
时,为了确保接口返回数据的一致性和可读性我们往往都会定义一个统一的对象来封装最终的返回结果(不管是成功还是失败都通过该对象进行统一的返回)。为了实现这些数据的统一返回,基本上我们采用的方式都是直接在Controller
层对数据进行统一的处理然后返回,而这种方式有如下的优缺点:
优点:
- 直观/简单:
Controller
层直接负责数据的封装,逻辑简单直观,不需要额外的配置或拦截器。 - 灵活性:
Controller
层可以根据具体的业务逻辑或API的需求,灵活地进行数据封装,包括添加额外的属性或执行一些业务特定的操作。 - 易于测试:由于封装逻辑在
Controller
层,可以直接对Controller
进行测试,而不需要考虑其他层的影响。
缺点:
- 代码冗余:由于每个接口都要返回统一的对象,可能会导致代码冗余。
- 维护成本:当需要修改或添加新的响应属性时,可能需要修改所有涉及到的
Controller
。
在了解了基于Controller
层直接进行统一数据封装的优缺点后,我们确实可以考虑使用其他方式来实现接口的统一返回数据格式。Spring
框架中的ResponseBodyAdvice
接口正是为此而设计的,它允许我们在全局范围内对响应体进行统一的封装和处理。
接下来,我们将通过一个案例来详细演示如何使用ResponseBodyAdvice
接口来实现接口的统一返回数据格式。
2、实战案例
2.1 定义统一的返回结果类
定义一个简单的返回值枚举
package com.news.utils;import lombok.Getter;@Getter
//簡單的返回代碼枚舉
public enum ResultCode {SUCCESS(0, "success"),FAILURE(1, "fail");private int code;private String message;ResultCode(int code, String message) {this.code = code;this.message = message;}
}
通用的返回結果类
package com.news.utils;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.extern.slf4j.Slf4j;@Builder(toBuilder = true)
@AllArgsConstructor
@Setter
@Getter
@ToString
@Slf4j
public class Result<T> {/*** 提示信息*/@Schema(description = "提示信息")private String message;/*** 是否成功*/@Schema(description = "是否成功")private boolean success;/*** 返回状态码*/@Schema(description = "返回状态码")private Integer code;/*** 数据*/@Schema(description = "数据")private T data;public Result() {}public static Result success() {Result result = new Result();result.setSuccess(Boolean.TRUE);result.setCode(ResultCode.SUCCESS.getCode());result.setMessage(ResultCode.SUCCESS.getMessage());return result;}public static Result success(String msg) {Result result = new Result();result.setMessage(msg);result.setSuccess(Boolean.TRUE);result.setCode(ResultCode.SUCCESS.getCode());return result;}public static Result success(