本文介绍的是通过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格式,所以我们需要在该方法上指定返回的数据类型

返回结果:

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



















