本文介绍的是通过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格式,所以我们需要在该方法上指定返回的数据类型
返回结果:
掌握以上的几步,在项目中页完全够用了。