zoukankan      html  css  js  c++  java
  • SpringBoot后端返回统一的标准格式数据

    1.@RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器
    2.@ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以@ExceptionHandler(BusinessException.class)
    3.@ResponseStatus指定客户端收到的http状态码

    // 1.定义返回对象
    @Data
    public class ResultData<t> {
      /** 结果状态 ,具体状态码参见ResultData.java*/
      private int status;
      private String message;
      private T data;
      private long timestamp ;
    
      public ResultData (){
        this.timestamp = System.currentTimeMillis();
      }
    
      public static <t> ResultData<t> success(T data) {
        ResultData<t> resultData = new ResultData<>();
        resultData.setStatus(ReturnCode.RC100.getCode());
        resultData.setMessage(ReturnCode.RC100.getMessage());
        resultData.setData(data);
        return resultData;
      }
    
      public static <t> ResultData<t> fail(int code, String message) {
        ResultData<t> resultData = new ResultData<>();
        resultData.setStatus(code);
        resultData.setMessage(message);
        return resultData;
      }
    
    }
    
    // 2.定义状态码
    public enum ReturnCode {
        /**操作成功**/
        RC100(100,"操作成功"),
        /**操作失败**/
        RC999(999,"操作失败"),
        /**服务限流**/
        RC200(200,"服务开启限流保护,请稍后再试!"),
        /**服务降级**/
        RC201(201,"服务开启降级保护,请稍后再试!"),
        /**热点参数限流**/
        RC202(202,"热点参数限流,请稍后再试!"),
        /**系统规则不满足**/
        RC203(203,"系统规则不满足要求,请稍后再试!"),
        /**授权规则不通过**/
        RC204(204,"授权规则不通过,请稍后再试!"),
        /**access_denied**/
        RC403(403,"无访问权限,请联系管理员授予权限"),
        /**access_denied**/
        RC401(401,"匿名用户访问无权限资源时的异常"),
        /**服务异常**/
        RC500(500,"系统异常,请稍后重试"),
    
        INVALID_TOKEN(2001,"访问令牌不合法"),
        ACCESS_DENIED(2003,"没有权限访问该资源"),
        CLIENT_AUTHENTICATION_FAILED(1001,"客户端认证失败"),
        USERNAME_OR_PASSWORD_ERROR(1002,"用户名或密码错误"),
        UNSUPPORTED_GRANT_TYPE(1003, "不支持的认证模式");
    
        /**自定义状态码**/
        private final int code;
        /**自定义描述**/
        private final String message;
    
        ReturnCode(int code, String message){
            this.code = code;
            this.message = message;
        }
    
        public int getCode() {
            return code;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
    // 3.借助SpringBoot提供的ResponseBodyAdvice: 拦截Controller方法的返回值,统一处理返回值/响应体, 进一步封装;
    /**
     * 编写实现类,统一处理返回值
     * @author
     * @date 2021/7/28 10:10 上午
     */
    @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) {
            if(o instanceof String){
                return objectMapper.writeValueAsString(ResultData.success(o));
            }        
            return ResultData.success(o);
        }
    }
    
    // 4. 进一步优化,全局异常处理
    @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());
        }
    
    }
    // 5. 全局异常接入返回标准格式实现
    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<!--? extends HttpMessageConverter<?-->> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
      if(o instanceof String){
        return objectMapper.writeValueAsString(ResultData.success(o));
      }
      if(o instanceof ResultData){
        return o;
      }
      return ResultData.success(o);
    }
    每天一点点,惊喜不间断
  • 相关阅读:
    Android Studio 常用快捷键以及设置
    GitHub windows客户端拉代码和提交代码
    Android Studio + gradle多渠道打包
    Android sdk 镜像服务器资源
    Rikka with Graph(联通图取边,暴力)
    Rikka with Chess(规律)
    Largest Submatrix(动态规划)
    City Game(动态规划)
    Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)
    How many ways(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/wszn-java/p/15069847.html
Copyright © 2011-2022 走看看