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 {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return false;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return null;}
}
上述是基本的模版
(2)第二步:同意支持统一返回格式
@Overridepublic 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 {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic 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格式,所以我们需要在该方法上指定返回的数据类型
返回结果:
掌握以上的几步,在项目中页完全够用了。