天天看点

spring boot2 (39)- 统一返回结果和ResponseBodyAdvice

本篇介绍rest接口,如何返回统一的状态码、消息、数据等。

rest 返回结果封装

public class RestResult<T>  {
    
    private Integer code;        //状态码
    private String message;        //文字消息
    private T data;                //返回数据
    //省略get/
           

生成结果的静态方法

public class RestResultGenerator {
    
    //生成结果的静态方法
    public static <T> RestResult<T> genResult(Integer code, T data, String message) {
        RestResult<T> result = new RestResult<T>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(data);
        return result;
    }

    //以下是常用的一些方法,自动生成结果 
    public static <T> RestResult<T> success() {
        return success(null);
    }
    
    public static <T> RestResult<T> success(T data) {
        return genResult(0, data, null);//默认成功状态为0
    }

    public static <T> RestResult<T> error(String message) {
        return error(1, message);//默认失败状态为1
    }

    public static <T> RestResult<T> error(Integer retCode, String message) {
        return genResult(retCode, null, message);
    }
           

在控制层,直接调用以上静态方法,就可以组装统一格式的返回结果。但这样代码就整合在一起了,以下方式可以实现控制层和统一格式处理的分离。

成功统一返回ResponseBodyAdvice

@RestControllerAdvice(basePackages = {"com.xxx","com.controller"})
public class RestResultAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        //可检查参数,做一些自定义处理
        return true;//true表示执行beforeBodyWrite,false不执行
    }

    @Override
    public RestResult<Object> beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {
        //可检查参数,做一些自定义处理
        return RestResultGenerator.genResult(0,body,"success"); //统一成功返回
    }
           
  • basePackages:对特定包下的类生效
  • supports方法:控制层返回后,就会进入这个方法。在这里可获取参数returnType和converterType,可根据此做一些自定义的判断,检查是否是我们支持的参数,支持返回true,不支持返回false。我这里不做特别检查,直接返回true。
  • beforeBodyWrite:以上返回true时,会调用这个方法。同样可以检查一些参数,最终返回一个统一封装的结果。

异常结果返回

以上是请求成功的结果封装。假如是失败呢,根据不同的失败类型,可以抛出不同的异常。通过全局异常捕获类,同样调用RestResultGenerator.genResult,返回不同的状态码和消息文本,参考第15篇

继续阅读