SpringBoot统一返回格式(优雅实现)

目录

为什么统一格式?

创建统一返回值的VO类

创建拦截返回值的增强类

小栗子


SpringBoot实现ResponseBodyAdvice对controller返回值统一封装

为什么统一格式?

  1. 统一返回数据格式一般会包含状态码、返回消息、数据这几部分内容

  2. 方便前端人员方便解析数据和处理数据

  3. 前端会根据状态码的约定进行对应处理

创建统一返回值的VO类

public class R<T> {

    /** 状态码 */
    private Integer code;

    /** 消息体 */
    private String msg;

    /** 数据 */
    private T data;

    public static <T> R<T> sucess(T data) {
        R<T> r = new R<T>();
        r.setCode(200);
        r.setMsg("操作成功");
        r.setData(data);
        return r;
    }

    public static <T> R<T> error(String msg) {
        R<T> r = new R<T>();
        r.setCode(500);
        r.setMsg(msg);
        return r;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

创建拦截返回值的增强类

ps:方法JSON.toJSONString()使用的是阿里的fastjson,底部有fastjson的依赖

@RestControllerAdvice
public class ResponseBodyConfig implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
        if (returnType.getParameterType().equals(R.class)) {
            // 返回类型已是正确的
            return false;
        }
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType,
        Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
        ServerHttpResponse serverHttpResponse) {
        // String类型不能直接包装,需要转换JSON处理
        if (body instanceof String) {
            return JSON.toJSONString(R.sucess(body));
        }
        return R.sucess(body);
    }

}

小栗子

String类型

    @RequestMapping(value = "/testString", method = RequestMethod.POST)
    public String testString() {
        return "hello word";
    }

结果:

 List类型

    @RequestMapping(value = "/testList", method = RequestMethod.POST)
    public List<User> testList() {
        List<User> userList = Lists.newArrayList();

        User user = new User();
        user.setUsername("一个肥鲶鱼");
        user.setEmail("****@qq.com");

        userList.add(user);

        return userList;
    }

结果:

 搞定!!!

补充:

        <!-- 阿里JSON解析器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个肥鲶鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值