Spring项目中的统一结果返回

本文介绍的是通过Spring提供的接口进行结果统一封装,指的是成功返回的结果,不包含异常或者错误情况(这一块移步到统一异常处理)。另一种统一结果返回的方式,就是手动让每个接口的返回中类型都相同,这种方法相信大家都会,就不介绍了。

1.实现步骤

下面是成功结果的统一返回,项目中需要与统一异常(返回失败的结果)一起进行搭配。

(1)第一步:实现对应接口重写方法,并加上注解

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return false;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return null;
    }
}

上述是基本的模版

(2)第二步:同意支持统一返回格式

 @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

直接返回true表明所有的方法都支持统一结果返回

(3)第三步:封装统一返回结果

需要一个统一返回的对象

import lombok.Data;

@Data
public class Result {
    private String message;
    private int code;

    public Result(String message,int code) {
        this.message = message;
        this.code = code;
    }

    public static Result fail(String message) {
        return new Result(message,1314);
    }

    public static Result success(String message) {
        return new Result(message,1314);
    }

}

结果封装:修改beforeBodyWrite方法

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        //1.封装返回类型为String的--转成json再封装
        if(body instanceof String) {
            return objectMapper.writeValueAsString(Result.success(body));
        }
        //2.返回类型已经是封装的结果--直接返回
        if(body instanceof Result) {
            return Result.success(body);
        }
        //3.封装
        return Result.success(body);
    }
}

根据以上的步骤,就可以使用了。

上述当返回类型为String的时候,还会存在一个坑,下面通过实例介绍。

2.实现后的效果

(1)没加入统一结果返回时

通过postman测试:

(2)加入同一结果返回后

统一回答:在上述的统一结果返回中,如果返回值类型是String类型,我们需要先转化成json再进行封装,否则会报异常(源码内部问题,无需知道),也就是下面这样

但是进行封装后返回的是一个字符串格式,而不是json格式,所以我们需要在该方法上指定返回的数据类型

返回结果:

掌握以上的几步,在项目中页完全够用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码小娥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值