springboot优雅的,无侵入的,统一响应结构

本文介绍了如何使用Java的ApiResponse类作为统一的返回体,以及通过ControllerAdvice和ResponseBodyAdvice在SpringMVC中实现对控制层返回值的包装,确保响应结果具有标准化结构和格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义统一返回体

@Data
@AllArgsConstructor
public class ApiResponse<T> {
    private int status;
    private String message;
    private T data;

    // 可选的静态方法,用于创建成功的ApiResponse对象
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "Success", data);
    }

    // 可选的静态方法,用于创建失败的ApiResponse对象
    public static <T> ApiResponse<T> error(String message) {
        return new ApiResponse<>(500, message, null);
    }
}

上述代码定义了一个通用的返回体ApiResponse,包含状态码status、消息message和数据data。通过success方法创建成功的ApiResponse对象,通过error方法创建失败的ApiResponse对象。

通过ControllerAdvice定义控制层响应参数包装处理

@RestControllerAdvice(basePackages = {"com.sweet.mix", "com.example.mix"})
public class ResultAdviceHandler implements ResponseBodyAdvice<Object> {

    //supports方法用于实现是否符合处理条件,返回true时才会调用下面的beforeBodyWrite方法实现,否则不处理
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 对于非ApiResult类型的返回值同一包装成ApiResult类型返回值后再写入response
     *
     * @param body:原controller接口要返回的内容
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (body instanceof ApiResponse) {
            //如果是ApiResponse类型则直接返回
            return body;
        } else if (body instanceof String) {
            //这里需要注意 Controller 返回值为String类型时
            //ControllerAdvice的beforeBodyWrite拦截到String结果
            //在函数中处理String完成返回的结果不会有转换成json这一步操作
            //所以不判断的话会直接返回String类型
            //这时候如果我们ApiResponse.success(body)组装了结果,那么显然不是String
            //所以会报错cast not to string
            //所以这里需要一个String类型的判断 主动把结果转为json格式的字符串
            return JSON.toJSONString(ApiResponse.success(body));
        }
        return ApiResponse.success(body);
    }
}

上述代码定义了一个ResultAdviceHandler类,使用@RestControllerAdvice注解将其配置为全局的控制器增强,指定扫描的控制层所在的包。ResultAdviceHandler实现了ResponseBodyAdvice接口,通过重写supports方法和beforeBodyWrite方法实现对响应参数的包装处理。

supports方法用于判断是否需要对响应参数进行处理,这里返回true表示对所有参数进行处理。

beforeBodyWrite方法用于对非ApiResponse类型的返回值进行包装,将其转换为ApiResponse类型后再写入response。同时,对于返回值为String类型的情况,需要将其转换为ApiResponse对象的json格式字符串。

控制层代码

@RestController
@RequestMapping("/test")
public class DepartmentController {

    @ExecutionTime
    @GetMapping("/test")
    public String test(){
        return "OK";
    }

    @GetMapping("/test2")
    public Integer test2(){
        return 2;
    }

}

上述代码是一个示例的控制层代码,其中test方法返回字符串"OK"test2方法返回整数2

控制层无需任何处理,即可实现响应客户端时统一返回ApiResponse的结构。

示例

请求:http://localhost:9000/test/test

响应:

{
    "status": 200,
    "message": "Success",
    "data": "OK"
}

以上是一个使用ApiResponse统一包装响应体的示例,通过ResultAdviceHandler实现了对控制层返回值的统一处理。这样可以更好地控制响应结果的结构和格式,并且可以方便地添加其他自定义的返回信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值