个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道
如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充
前言
统一的返回结果格式是项目所必须的组件,应在搭建项目前就定好格式,前端与后端都按照该约定进行数据的组装和解析
自定义异常则是为了统一化处理各种异常情况,诸如密码错误、用户不存在此类,若都分别处理,则代码过于冗长,且不易集中处理(配合全局异常捕获)
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
个人站点:在搭了在搭了。。。(右键 - 新建文件夹)