Springboot统一返回格式

1、定义返回标准格式

一个标准的返回格式至少包含3部分:

  1. status 状态值:由后端统一定义各种返回结果的状态码

  2. message 描述:本次接口调用的结果描述

  3. data 数据:本次返回的数据。

    package com.online.analyze.comm.util;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class ResultData<T> implements Serializable {
        public static final Integer SUCCESS_CODE = 0;
        public static final Integer FAILURE_CODE = -1;
        public static final Integer ERROR_CODE = 9999;
        public static final Integer DEALING = 2222;
    
        public static final String DEALING_MSG = "处理中";
        public static final String SUCCESS_MSG = "成功";
        public static final String FAILURE_MSG = "失败";
        public static final String ERROR_MSG = "系统异常";
    
        private Integer code;
        private String msg;
        protected T data;
    
        public static <T> ResultData<T> success(){
            return new ResultData(SUCCESS_CODE,SUCCESS_MSG,null);
        }
        public static <T> ResultData<T> success(String msg,T t){
            return new ResultData(SUCCESS_CODE,msg,t);
        }
        public static <T> ResultData<T> success(T t){
            return new ResultData(SUCCESS_CODE,SUCCESS_MSG,t);
        }
    
        public static <T> ResultData<T> fail(){
            return new ResultData(FAILURE_CODE,FAILURE_MSG,null);
        }
        public static <T> ResultData<T> fail(T t){
            return new ResultData(FAILURE_CODE,FAILURE_MSG,t);
        }
        public static <T> ResultData<T> fail(String msg,T t){
            return new ResultData(FAILURE_CODE,msg,t);
        }
        public static <T> ResultData<T> fail(Integer code,String msg,T t){
            return new ResultData<T>(code,msg,t);
        }
        public static <T> ResultData<T> fail(String msg){
            return new ResultData(FAILURE_CODE,msg,null);
        }
        public static <T> ResultData<T> error(){
            return  new ResultData<>(ERROR_CODE,ERROR_MSG,null);
        }
    
        public static <T> ResultData<T> error(String msg){
            return  new ResultData<>(ERROR_CODE,msg,null);
        }
    
        public static <T> ResultData<T> dealing(){
            return new ResultData<>(DEALING,DEALING_MSG,null);
        }
        public static <T> ResultData<T> dealing(String msg){
            return new ResultData<>(DEALING,msg,null);
        }
        public static <T> ResultData<T> dealing(String msg,T t){
            return new ResultData<>(DEALING,msg,t);
        }
        public static <T> ResultData<T> dealing(T t){
            return new ResultData<>(DEALING,DEALING_MSG,t);
        }
    
    }
    

    接口统一返回

    return ResultData.success("msg",data);

2、借助SpringBoot提供的ResponseBodyAdvice,统一处理controller返回值,不要每个接口都手工制定ResultData返回值
 

“

ResponseBodyAdvice的作用:拦截Controller方法的返回值,统一处理返回值/响应体,一般用来统一返回格式,加解密,签名等等。
” 
public interface ResponseBodyAdvice<T> {
  /**
  * 是否支持advice功能
  * true 支持,false 不支持
  */
    boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);
 
   /**
  * 对返回的数据进行处理
  */
    @Nullable
    T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}
    //实现类处理
    //@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:

    //全局异常处理

    //全局数据绑定

    //全局数据预处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private ObjectMapper objectMapper;
 
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
 
    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
        if(o instanceof String){
            return objectMapper.writeValueAsString(ResultData.success(o));
        }        
        if(o instanceof ResultData){
  return o;
}
        return ResultData.success(o);
    }
}

3、针对异常的处理

上边进行的封装,如果遇到异常返回时,仍然会正常返回返回的也是成功的状态,所以需要针对异常进行全局异常统一处理。

 

@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {
    /**
     * 默认全局异常处理。
     * @param e the e
     * @return ResultData
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultData<String> exception(Exception e) {
        log.error("全局异常信息 ex={}", e.getMessage(), e);
        return ResultData.fail(ReturnCode.RC500.getCode(),e.getMessage());
    }
 
}





    @RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器

    @ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以@ExceptionHandler(BusinessException.class)

    @ResponseStatus指定客户端收到的http状态码
    //实现类处理
    //@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:

    //全局异常处理

    //全局数据绑定

    //全局数据预处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private ObjectMapper objectMapper;
 
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
 
    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
        if(o instanceof String){
            return objectMapper.writeValueAsString(ResultData.success(o));
        }  
//如果返回的结果是ResultData对象,直接返回即可      
        if(o instanceof ResultData){
  return o;
}
        return ResultData.success(o);
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值