• 【SpirngBoot组件(2)】统一返回结果格式与自定义异常


    个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道

    如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充

    前言

    统一的返回结果格式是项目所必须的组件,应在搭建项目前就定好格式,前端与后端都按照该约定进行数据的组装和解析

    自定义异常则是为了统一化处理各种异常情况,诸如密码错误、用户不存在此类,若都分别处理,则代码过于冗长,且不易集中处理(配合全局异常捕获)

    1.介绍

    统一返回结果通常需要至少三个参数:返回码、返回信息、返回数据,其余参数请自行追加

    统一异常通常继承自RuntimeException,以与其他非运行异常区分,异常类型请自行查阅资料补充,不做赘述

    其余没啥好介绍的,直接看代码吧,请自行根据需求调整

    2.集成

    2.1.统一返回结果格式

    @Data
    public class ReturnMsg implements Serializable {
    
        /**
         * 序列号
         */
        private static final long serialVersionUID = CommonConstants.SERIAL_VERSION_UID;
    
        /**
         * 结果
         */
        public static final ReturnMsg SUCCESS = success();//操作成功
        public static final ReturnMsg FAIL = error(ResponseConstants.RETURN_MSG_ERROR);//操作失败
        public static final ReturnMsg UN_LOGIN = error(ResponseConstants.RETURN_MSG_NOT_LOGIN);//未登录
    
        /**
         * 返回码
         */
        private int code;
        /**
         * 返回信息
         */
        private String msg;
        /**
         * 返回数据
         */
        private Object data;
        /**
         * 是否成功
         */
        private boolean success;
    
        public ReturnMsg() {
            super();
            this.code = ResponseConstants.RETURN_CODE_SUCCESS;
            this.success = true;
        }
    
        public ReturnMsg(int code, String msg, Object data, boolean success) {
            super();
            this.code = code;
            this.msg = msg;
            this.data = data;
            this.success = success;
        }
    
        public static ReturnMsg success() {
            return new ReturnMsg(ResponseConstants.RETURN_CODE_SUCCESS, ResponseConstants.RETURN_MSG_SUCCESS, null, true);
        }
    
        public static ReturnMsg success(Object data) {
            return new ReturnMsg(ResponseConstants.RETURN_CODE_SUCCESS,  ResponseConstants.RETURN_MSG_SUCCESS, data, true);
        }
    
        public static ReturnMsg error(String msg) {
            return new ReturnMsg(ResponseConstants.RETURN_CODE_ERROR, msg, null, false);
        }
    
        public static ReturnMsg error(Object data, String msg) {
            return new ReturnMsg(ResponseConstants.RETURN_CODE_ERROR, msg, data, false);
        }
    
        public static ReturnMsg unLogin(String msg) {
            return new ReturnMsg(ResponseConstants.RETURN_CODE_NOT_LOGIN, null, msg, false);
        }
    
    }
    
    
    public class ResponseConstants {
    
        /**
         * 请求返回码
         */
        public static final int RETURN_CODE_SUCCESS     = 0;    //成功
        public static final int RETURN_CODE_ERROR       = -1;   //错误
        public static final int RETURN_CODE_WARN        = 1;    //警告
        public static final int RETURN_CODE_NOT_LOGIN   = -100;   //未登录
    
        /**
         * 请求返回信息
         */
        public static final String RETURN_MSG_SUCCESS               = "操作成功";
        public static final String RETURN_MSG_ERROR                 = "操作失败";
        public static final String RETURN_MSG_NOT_LOGIN             = "未登录";
        public static final String RETURN_MSG_ABNORMAL_OPERATION    = "操作异常";
        public static final String RETURN_MSG_ABNORMAL_NETWORK      = "网络异常";
    }
    

    2.2.统一异常

    public class BaseException extends RuntimeException {
    
        private ReturnMsg returnMsg;
    
        public BaseException(String msg) throws Exception {
            super(msg);
        }
    
        public ReturnMsg asReturnMsg() {
            if (null == returnMsg) {
                this.returnMsg = ReturnMsg.error(this.getMessage());
            } else {
                this.returnMsg.setMsg(this.getMessage());
            }
            return this.returnMsg;
        }
    }
    

    3.使用

    3.1.统一返回格式

    示例如下:

            if (StringUtils.isBlank(oldMessage)) {
                return ReturnMsg.error("消息为空");
            }
    

    3.2.自定义异常

    示例如下:

            if (StringUtils.isBlank(oldMessage)) {
                throw new RuntimeException("消息为空");
            }
    

    4.相关资料

    • 自定义异常及统一数据返回格式:请自行查阅相关资料,实现方案很简单易懂,本人也有做相关笔记

    5.补充

    • 请慎用Preconditions及其类似工具检查数据,数据违规时抛出的异常将会和其余运行异常混淆,无法区分,要么放弃此类工具,要么自行寻找解决方案
    • 尽管全局处理了,但异常就是异常,是不正常的情况。前端数据异常请返回数据告知前端,后端问题请尽可能完善代码以规避。异常就是异常,处理了仍然是异常

    BB两句

    这类框架性组件尽早定下来,当前项目已经大范围使用了Preconditions。。。花了半天没有完美解决方案,只能做出让步进行兼容处理,处女座表示相当难受


    作者:Echo_Ye

    WX:Echo_YeZ

    email :echo_yezi@qq.com

    个人站点:在搭了在搭了。。。(右键 - 新建文件夹)

  • 相关阅读:
    Ueditor之SAE移植
    SAE flask及其扩展 bug指南
    SAE 安装未包含的第三方依赖包
    Bootstrap 和 LESS
    Device.js——检测设备平台、操作系统的Javascript 库
    Flask 富文本编辑器
    DDoS攻击
    WPF之数据绑定
    参数测试
    总结 一下UML 类图的关系
  • 原文地址:https://www.cnblogs.com/silent-bug/p/13563216.html
Copyright © 2020-2023  润新知