• SpringBoot接口格式和规范


    SpringBoot接口格式

    概述:通过对接口返回格式的统一定义方便接收方统一调用和发送端处理。

    通过对响应类型的枚举定义、返回格式的模板化、springboot的统一返回拦截处理和统一返回异常处理。

    接口响应标准定义

    {
        "code": 10001,
        "message": "XXXX",
        "data": {
            "XXX": "XXX"
        }
    }
    

    响应枚举类型

    public class Enum ResultEnum{
    	SUCCESS(1000,"成功"),
        SYSTEM_ERROR(5000,"系统内部异常"),
       	//追加自定义类型
        ;
        private Integer code;
        private String message;
        ResultEnum(Integer code, String message) {
            this.code = code;
            this.message = message;
        }
    }
    

    返回类型格式

    
    @Data
    public class Result<T>{
        private Integer code;
        private String  message;
        private T data;
    
        /**
         * 定义成功无返回值方法
         * @return
         */
        public static  Result successResult() {
            return getSuccessResult();
        }
    
        /**
         * 定义成功有data方法
         * @param data
         * @return
         */
        public static  Result successResult(Object data) {
            Result result =getSuccessResult();
            result.setData(data);
            return result;
        }
        private static Result getSuccessResult(){
            Result result = new Result();
            result.setCode(ResultEnum.SUCCESS.getCode());
            result.setMessage(ResultEnum.SUCCESS.getMessage());
            return result;
        }
    
        /**
         * 定义异常无返回值方法
         * @return
         */
        public static  Result errorResult() {
            return getErrorResult();
        }
    
        /**
         * 定义成异常有data方法
         * @param data
         * @return
         */
        public static  Result errorResult(Object data) {
            Result result =getErrorResult();
            result.setData(data);
            return result;
        }
        private static Result getErrorResult(){
            Result result = new Result();
            result.setCode(ResultEnum.SYSTEM_ERROR.getCode());
            result.setMessage(ResultEnum.SYSTEM_ERROR.getMessage());
            return result;
        }
    
        /**
         * 根据ResultEnum获取返回值信息
         * @param resultEnum
         * @param data
         * @return
         */
        public static  Result result(ResultEnum resultEnum,Object data) {
            Result result = new Result();
            result.setCode(resultEnum.getCode());
            result.setMessage(resultEnum.getMessage());
            result.setData(data);
            return result;
        }
    }
    

    全局返回值

    ResponseBodyAdvice<Object>接口 源码阅读

    ResponseBodyAdvice的作用:拦截Controller方法的返回值,统一处理返回值/响应体,一般用来做response的统一格式、加解密、签名等等。

    public interface ResponseBodyAdvice <T> {
        //是否支持拦截
        boolean supports(org.springframework.core.MethodParameter methodParameter, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass);
    	//自定义的接口处理
        @org.springframework.lang.Nullable
        T beforeBodyWrite(@org.springframework.lang.Nullable T t, org.springframework.core.MethodParameter methodParameter, org.springframework.http.MediaType mediaType, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass, org.springframework.http.server.ServerHttpRequest serverHttpRequest, org.springframework.http.server.ServerHttpResponse serverHttpResponse);
    }
    

    自定义的ResponseHandler

    //全局拦截包定义
    @RestControllerAdvice(basePackages = "com.xxx.controller")
    public class ResponseHandler implements ResponseBodyAdvice<Object> {
        @Override
        public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
            return true;
        }
    
        @Override
        public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<?
                extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
                                      ServerHttpResponse serverHttpResponse) {
            //对返回的Object对象处理
            //String 格式是比较特殊的
            if (o instanceof String) {
                return JSONObject.toJSONString(Result.successResult(o));
            }
            return Result.successResult(o);
        }
    }
    

    异常处理接口

    @RestControllerAdvice,Springboot提供的对所有的全局处理方法。

    它通常用来定义@ExceptionHandler@InitBinder以及@ModelAttribute 适用于所有方法@RequestMapping的方法。

    1. 异常处理。
    2. 在其执行之前初始化数据绑定器。
    3. 把值绑定到Model中,使全局@RequestMapping可以获取到该值。
    
    @RestControllerAdvice
    public class GlobalExceptionAdvice {
        /**
         * 处理运行时异常
         */
        //定义返回值response的httpcode
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        @ExceptionHandler(Throwable.class)
        public Result handleThrowable(Throwable e, HttpServletRequest request) {
            //结合ErrorResult对异常及结果信息进行捕获返回
            return errorResult;
        }
    
        /**
         * 处理自定义异常
         */
        @ExceptionHandler(BusinessException.class)
        public Result handleBusinessException(BusinessException e, HttpServletRequest request) {
            //结合ErrorResult对异常及结果信息进行捕获返回
            return errorResult;
        }
    }
    
    

    自定义异常

    自定义异常定义使用

    参数的校验。处理,空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)

    public class BusinessException extends RuntimeException {
    
        protected Integer code;
    
        protected String message;
    
        public  BusinessException(ResultEnum resultEnum){
            this.code = resultEnum.getCode();
            this.errMsg = resultEnum.getMsg();
        }
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public String getErrMsg() {
            return errMsg;
        }
    
        public void setErrMsg(String errMsg) {
            this.errMsg = errMsg;
        }
    }
    
  • 相关阅读:
    【PL/SQL练习】函数
    【PL/SQL练习】命名块: 存储过程、函数、触发器、包
    【PL/SQL练习】自定义异常
    织梦首页/列表页文章按权重排序
    织梦dede:channel取子栏目时重复显示同级栏目的解决方法
    织梦最新版后台一键更新网站、更新文档HTML卡死的解决方法
    虚拟主机二级域名(m.dedehtml.com)绑定到织梦子目录(m)做手机站
    织梦自定义表单数据校验不对的解决方法
    织梦自定义表单用js代替联动地区解决联动地区选择
    织梦自定义图片字段调用图片地址
  • 原文地址:https://www.cnblogs.com/JunQiang-Ma/p/14992161.html
Copyright © 2020-2023  润新知