提交 4397cbe6 authored 作者: YunaiV's avatar YunaiV

重构错误码的设计,第一次提交~

上级 c5596919
package cn.iocoder.common.framework.enums;
/**
* Mall 全局枚举
*/
public interface MallConstants {
// 全局请求路径枚举类,用于定义不同用户类型的根请求路径
/**
* 根路径 - 用户
*/
String ROOT_PATH_USER = "/users";
/**
* 根路径 - 管理员
*/
String ROOT_PATH_ADMIN = "/admins";
// 用户类型
/**
* 用户类型 - 用户
*/
@Deprecated
Integer USER_TYPE_USER = 1;
/**
* 用户类型 - 管理员
*/
@Deprecated
Integer USER_TYPE_ADMIN = 2;
// HTTP Request Attr
/**
* HTTP Request Attr - 用户编号
*/
String REQUEST_ATTR_USER_ID_KEY = "mall_user_id";
/**
* HTTP Request Attr - 用户类型
*/
String REQUEST_ATTR_USER_TYPE_KEY = "mall_user_type";
/**
* HTTP Request Attr - Controller 执行返回
*/
String REQUEST_ATTR_COMMON_RESULT = "mall_common_result";
}
package cn.iocoder.common.framework.exception;
import cn.iocoder.common.framework.exception.enums.ServiceErrorCodeRange;
/**
* 错误码对象
*
* 全局错误码,占用 [0, 999],参见 {@link GlobalException}
* 业务异常错误码,占用 [1 000 000 000, +∞),参见 {@link ServiceErrorCodeRange}
*
* TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备
*/
public class ErrorCode {
/**
* 错误码
*/
private final Integer code;
/**
* 错误提示
*/
private final String message;
public ErrorCode(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
package cn.iocoder.common.framework.exception;
import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.vo.CommonResult;
/**
* 全局异常 Exception
*/
public class GlobalException extends RuntimeException {
/**
* 全局错误码
*
* @see GlobalErrorCodeEnum
*/
private final Integer code;
/**
* 错误明细,内部调试错误
* * 和 {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
public GlobalException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public String getDetailMessage() {
return detailMessage;
}
public GlobalException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
}
package cn.iocoder.common.framework.exception; package cn.iocoder.common.framework.exception;
import cn.iocoder.common.framework.exception.enums.ServiceErrorCodeRange;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
/** /**
* 服务异常 * 业务逻辑异常 Exception
* *
* 参考 https://www.kancloud.cn/onebase/ob/484204 文章 * 参考 https://www.kancloud.cn/onebase/ob/484204 文章
* *
...@@ -32,7 +33,9 @@ import cn.iocoder.common.framework.vo.CommonResult; ...@@ -32,7 +33,9 @@ import cn.iocoder.common.framework.vo.CommonResult;
public final class ServiceException extends RuntimeException { public final class ServiceException extends RuntimeException {
/** /**
* 错误码 * 业务错误码
*
* @see ServiceErrorCodeRange
*/ */
private final Integer code; private final Integer code;
/** /**
......
package cn.iocoder.common.framework.enums; package cn.iocoder.common.framework.exception.enums;
import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil;
/** /**
* 全局错误码枚举 * 全局错误码枚举
* 1-999 系统异常编码保留 * 0-999 系统异常编码保留
* *
* 一般情况下,{@link GlobalErrorCodeEnum#getCode()} ()} 使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status * 一般情况下,{@link GlobalErrorCodeEnum#getCode()} ()} 使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
* 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的
......
package cn.iocoder.common.framework.enums; package cn.iocoder.common.framework.exception.enums;
/** /**
* 模块错误码区间 * 业务异常的错误码区间,解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用
* *
* 解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用 * 一共 10 位,分成四段
* *
* * 第一段,1 位,类型
* 错误码定义说明: * 1 - 业务级别异常
* * x - 预留
* [0-000-000-000] 1 开头,给业务系统,2 开头,给框架使用 * 第二段,3 位,系统类型
* * 001 - 用户系统
* 如:用户系统,使用 1-001-000-000 段 * 002 - 商品系统
* 003 - 订单系统
* 004 - 支付系统
* 005 - 优惠劵系统
* ... - ...
* 第三段,3 位,模块
* 不限制规则。
* 一般建议,每个系统里面,可能有多个模块,可以再去做分段。以用户系统为例子:
* 001 - OAuth2 模块
* 002 - User 模块
* 003 - MobileCode 模块
* 第四段,3 位,错误码
* 不限制规则。
* 一般建议,每个模块自增。
* *
* @author Sin * @author Sin
* @time 2019-03-23 11:28 * @time 2019-03-23 11:28
*/ */
public class ModuleErrorCodeInterval { public class ServiceErrorCodeRange {
// order 错误码区间 [1-000-001-000 ~ 1-000-002-000] // order 错误码区间 [1-000-001-000 ~ 1-000-002-000]
// user 错误码区间 [1-001-000-000 ~ 1-002-000-000) // user 错误码区间 [1-001-000-000 ~ 1-002-000-000)
// admin 错误码区间 [1-002-000-000 ~ 1-003-000-000) // system-service 服务 => 错误码区间 [1-002-000-000 ~ 1-003-000-000)
// product 错误码区间 [1-003-000-000 ~ 1-004-000-000) // product 错误码区间 [1-003-000-000 ~ 1-004-000-000)
...@@ -31,5 +44,4 @@ public class ModuleErrorCodeInterval { ...@@ -31,5 +44,4 @@ public class ModuleErrorCodeInterval {
// promotion 错误码区间 [1-006-000-000 ~ 1-007-000-000) // promotion 错误码区间 [1-006-000-000 ~ 1-007-000-000)
} }
package cn.iocoder.common.framework.util; package cn.iocoder.common.framework.util;
import cn.iocoder.common.framework.enums.MallConstants;
import cn.iocoder.common.framework.vo.CommonResult;
import org.apache.skywalking.apm.toolkit.trace.TraceContext; import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import javax.servlet.ServletRequest;
import java.util.UUID; import java.util.UUID;
public class MallUtils { public class MallUtils {
public static Integer getUserId(ServletRequest request) {
return (Integer) request.getAttribute(MallConstants.REQUEST_ATTR_USER_ID_KEY);
}
public static void setUserId(ServletRequest request, Integer userId) {
request.setAttribute(MallConstants.REQUEST_ATTR_USER_ID_KEY, userId);
}
public static Integer getUserType(ServletRequest request) {
return (Integer) request.getAttribute(MallConstants.REQUEST_ATTR_USER_TYPE_KEY);
}
public static void setUserType(ServletRequest request, Integer userType) {
request.setAttribute(MallConstants.REQUEST_ATTR_USER_TYPE_KEY, userType);
}
@Deprecated
public static CommonResult getCommonResult(ServletRequest request) {
return (CommonResult) request.getAttribute(MallConstants.REQUEST_ATTR_COMMON_RESULT);
}
@Deprecated
public static void setCommonResult(ServletRequest request, CommonResult result) {
request.setAttribute(MallConstants.REQUEST_ATTR_COMMON_RESULT, result);
}
/** /**
* 获得链路追踪编号 * 获得链路追踪编号
* *
......
...@@ -52,10 +52,13 @@ public class ServiceExceptionUtil { ...@@ -52,10 +52,13 @@ public class ServiceExceptionUtil {
public static void put(Integer code, String message) { public static void put(Integer code, String message) {
ServiceExceptionUtil.messages.put(code, message); ServiceExceptionUtil.messages.put(code, message);
} }
public static void delete(Integer code, String message) { public static void delete(Integer code, String message) {
ServiceExceptionUtil.messages.remove(code, message); ServiceExceptionUtil.messages.remove(code, message);
} }
// ========== 和 CommonResult 的集成 ==========
public static <T> CommonResult<T> error(Enumerable enumerable) { public static <T> CommonResult<T> error(Enumerable enumerable) {
return error(enumerable.getCode()); return error(enumerable.getCode());
} }
...@@ -73,6 +76,8 @@ public class ServiceExceptionUtil { ...@@ -73,6 +76,8 @@ public class ServiceExceptionUtil {
return CommonResult.error(code, message); return CommonResult.error(code, message);
} }
// ========== 和 ServiceException 的集成 ==========
public static ServiceException exception(Enumerable enumerable) { public static ServiceException exception(Enumerable enumerable) {
String messagePattern = messages.getOrDefault(enumerable.getCode(), enumerable.getMessage()); String messagePattern = messages.getOrDefault(enumerable.getCode(), enumerable.getMessage());
return exception0(enumerable.getCode(), messagePattern); return exception0(enumerable.getCode(), messagePattern);
......
package cn.iocoder.common.framework.vo; package cn.iocoder.common.framework.vo;
import cn.iocoder.common.framework.enums.GlobalErrorCodeEnum; import cn.iocoder.common.framework.exception.ErrorCode;
import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -18,6 +19,8 @@ public final class CommonResult<T> implements Serializable { ...@@ -18,6 +19,8 @@ public final class CommonResult<T> implements Serializable {
/** /**
* 错误码 * 错误码
*
* @see ErrorCode#getCode()
*/ */
private Integer code; private Integer code;
/** /**
...@@ -26,6 +29,8 @@ public final class CommonResult<T> implements Serializable { ...@@ -26,6 +29,8 @@ public final class CommonResult<T> implements Serializable {
private T data; private T data;
/** /**
* 错误提示,用户可阅读 * 错误提示,用户可阅读
*
* @see ErrorCode#getMsg()
*/ */
private String message; private String message;
/** /**
......
package cn.iocoder.mall.dubbo.core.filter; package cn.iocoder.mall.dubbo.core.filter;
import cn.iocoder.common.framework.enums.GlobalErrorCodeEnum; import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.exception.ServiceException; import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.common.framework.util.ExceptionUtil; import cn.iocoder.common.framework.util.ExceptionUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil;
......
package cn.iocoder.mall.security.admin.core.interceptor; package cn.iocoder.mall.security.admin.core.interceptor;
import cn.iocoder.common.framework.enums.GlobalErrorCodeEnum; import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.enums.UserTypeEnum; import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.util.CollectionUtils; import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.HttpUtil; import cn.iocoder.common.framework.util.HttpUtil;
......
package cn.iocoder.mall.security.user.core.interceptor; package cn.iocoder.mall.security.user.core.interceptor;
import cn.iocoder.common.framework.enums.GlobalErrorCodeEnum; import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.enums.UserTypeEnum; import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.util.HttpUtil; import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.util.ServiceExceptionUtil;
......
package cn.iocoder.mall.web.core.handler; package cn.iocoder.mall.web.core.handler;
import cn.iocoder.common.framework.enums.GlobalErrorCodeEnum; import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum;
import cn.iocoder.common.framework.exception.ServiceException; import cn.iocoder.common.framework.exception.ServiceException;
import cn.iocoder.common.framework.util.ExceptionUtil; import cn.iocoder.common.framework.util.ExceptionUtil;
import cn.iocoder.common.framework.util.HttpUtil; import cn.iocoder.common.framework.util.HttpUtil;
......
...@@ -18,7 +18,7 @@ import java.util.Collections; ...@@ -18,7 +18,7 @@ import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import static cn.iocoder.common.framework.enums.GlobalErrorCodeEnum.FORBIDDEN; import static cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum.FORBIDDEN;
/** /**
* 权限 Manager * 权限 Manager
......
...@@ -21,7 +21,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -21,7 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.common.framework.enums.GlobalErrorCodeEnum.FORBIDDEN; import static cn.iocoder.common.framework.exception.enums.GlobalErrorCodeEnum.FORBIDDEN;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*; import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum.*;
/** /**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论