You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

359 lines
18 KiB

1 month ago
# 通用常量与枚举
<cite>
**本文引用的文件**
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“通用常量与枚举”的规范与使用,聚焦以下目标:
- 系统级常量定义(HTTP 状态码、请求头、数据库相关常量等)在 CommonConstants 中的组织方式与使用建议。
- HasValueEnum 与 StatusEnum 的设计意图、使用方法与扩展方式。
- ResultCodeEnum 的响应码规范与错误码体系,以及与统一返回体 Result、分页结果 PageResult 的配合。
- 提供最佳实践与自定义枚举创建指导,帮助团队保持一致性、可维护性与可扩展性。
## 项目结构
与通用常量与枚举相关的代码集中在 crm-base 模块中,便于各业务模块复用:
- 常量定义:crm-base/.../constant/CommonConstants.java
- 通用枚举:crm-base/.../domain/enums/HasValueEnum.java、StatusEnum.java
- 统一响应与错误码:crm-base/.../domain/result/ResultCodeEnum.java、Result.java、PageResult.java
- 全局异常处理:crm-base/.../advice/GlobalExceptionHandlerAdvice.java
```mermaid
graph TB
subgraph "基础能力(crm-base)"
CC["CommonConstants<br/>系统常量"]
HVE["HasValueEnum<br/>带值枚举基类"]
SE["StatusEnum<br/>状态枚举示例"]
RCE["ResultCodeEnum<br/>响应码与错误码"]
RES["Result<br/>统一返回体"]
PAGERES["PageResult<br/>分页返回体"]
GHA["GlobalExceptionHandlerAdvice<br/>全局异常处理"]
end
CC --> RES
HVE --> SE
RCE --> RES
RCE --> PAGERES
GHA --> RES
GHA --> RCE
```
图表来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
章节来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
## 核心组件
- CommonConstants:集中管理系统级常量,如 HTTP 状态码、常用请求头、数据库相关常量等,避免散落在各处导致不一致。
- HasValueEnum:为“带值枚举”提供统一抽象,便于枚举项携带业务值(如 code、message),并提供转换工具方法。
- StatusEnum:基于 HasValueEnum 的典型实现,用于表示常见状态(如启用/禁用、有效/无效等)。
- ResultCodeEnum:定义统一的响应码与错误码,配合 Result/PageResult 形成一致的 API 返回规范。
- GlobalExceptionHandlerAdvice:将业务异常转换为标准 Result 响应,确保错误码与消息的统一输出。
章节来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
## 架构总览
下图展示了常量与枚举在统一响应流程中的作用:业务层通过 ResultCodeEnum 获取错误码,结合业务信息封装为 Result;全局异常处理器将未捕获异常转为标准响应;分页场景使用 PageResult。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Controller as "控制器"
participant Service as "服务层"
participant Enum as "ResultCodeEnum"
participant Resp as "Result/PageResult"
participant ExHandler as "GlobalExceptionHandlerAdvice"
Client->>Controller : "发起请求"
Controller->>Service : "执行业务逻辑"
Service-->>Controller : "返回数据或抛出异常"
alt "正常返回"
Controller->>Resp : "封装成功响应(含code/message/data)"
Resp-->>Client : "标准JSON响应"
else "发生异常"
Controller->>ExHandler : "抛出异常"
ExHandler->>Enum : "解析错误码/默认码"
ExHandler->>Resp : "封装错误响应"
Resp-->>Client : "标准JSON响应"
end
```
图表来源
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
## 详细组件分析
### CommonConstants:系统常量
- 职责:集中定义跨模块复用的系统常量,包括但不限于:
- HTTP 状态码常量(如 2xx/4xx/5xx 分类)
- 常用请求头键名(如认证、追踪、内容类型等)
- 数据库相关常量(如表名前缀、字段命名约定、分页默认值等)
- 设计要点:
- 使用静态 final 常量,保证不可变与线程安全
- 按功能域分组(HTTP、Header、DB、Cache、Time 等),提升可读性
- 避免硬编码字符串散落各处,统一由该常量类导出
- 使用建议:
- 在过滤器、拦截器、Web 层统一读取请求头
- 在持久化层使用表/字段前缀常量,保持命名一致
- 在配置类中使用默认分页大小、超时时间等常量
章节来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
### HasValueEnum:带值枚举基类
- 设计意图:为所有“带业务值”的枚举提供统一抽象,典型包含:
- 业务值字段(如 code、value)
- 描述字段(如 message、label)
- 根据值查找枚举项的方法
- 校验与转换工具方法
- 复杂度与性能:
- 查找通常为 O(n) 线性扫描,若枚举项较多可引入缓存映射以提升性能
- 建议在枚举初始化时构建 value->enum 的映射,使查找降为 O(1)
- 扩展方式:
- 新建枚举实现 HasValueEnum,定义自身业务值与描述
- 提供 fromValue(value) 或类似方法,支持按值反查枚举
- 对非法值进行明确异常提示,便于问题定位
```mermaid
classDiagram
class HasValueEnum {
+getValue() T
+getMessage() String
+fromValue(value) HasValueEnum
}
class StatusEnum {
+ACTIVE
+INACTIVE
+getValue() int
+getMessage() String
}
HasValueEnum <|-- StatusEnum : "实现"
```
图表来源
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
章节来源
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
### StatusEnum:状态枚举示例
- 用途:表达常见的状态语义(如启用/禁用、有效/无效等),并绑定对应的业务值与描述
- 使用模式:
- 在 DTO/VO 中使用枚举类型替代裸数值,增强可读性
- 在查询条件中通过枚举值构造 SQL 参数
- 在前端展示时通过枚举描述渲染友好文本
- 扩展建议:
- 新增状态时,遵循 HasValueEnum 的契约,补充 fromValue 映射
- 避免修改已有枚举项的值,确保向后兼容
章节来源
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
### ResultCodeEnum:响应码与错误码体系
- 职责:统一定义 API 响应码与错误码,包括:
- 成功码(如 200/0)
- 客户端错误码(如参数错误、权限不足、资源不存在)
- 服务端错误码(如系统异常、第三方调用失败)
- 与统一返回体的协作:
- Result:封装 code、message、data,作为接口统一返回结构
- PageResult:封装分页数据(列表、总数、页码等),同样遵循 code/message 规范
- 使用建议:
- 业务异常应映射到具体的错误码,而非直接透传异常堆栈
- 对外暴露的错误码需具备清晰语义,避免泄露内部实现细节
- 新增错误码时,需在文档中同步更新说明
```mermaid
flowchart TD
Start(["进入业务方法"]) --> CheckParam["参数校验"]
CheckParam --> ParamOK{"参数合法?"}
ParamOK --> |否| BuildErr["构建错误响应(Result)<br/>使用ResultCodeEnum错误码"]
ParamOK --> |是| DoBiz["执行业务逻辑"]
DoBiz --> BizOK{"执行成功?"}
BizOK --> |否| HandleErr["捕获异常并映射为错误码"]
BizOK --> |是| BuildOk["构建成功响应(Result)<br/>code=成功码,data=业务数据"]
HandleErr --> BuildErr
BuildErr --> End(["返回统一响应"])
BuildOk --> End
```
图表来源
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
章节来源
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
### 全局异常处理与统一响应
- GlobalExceptionHandlerAdvice:集中处理未捕获异常,将其转换为标准 Result 响应,确保:
- 错误码统一来自 ResultCodeEnum
- 错误消息对用户友好且不泄露敏感信息
- 日志记录关键上下文以便排障
- 与 Result 的配合:
- 成功路径:controller/service 返回业务数据,统一封装为 Result
- 失败路径:异常处理器捕获异常,映射为错误码并封装为 Result
```mermaid
sequenceDiagram
participant C as "客户端"
participant Ctrl as "控制器"
participant Svc as "服务层"
participant EH as "GlobalExceptionHandlerAdvice"
participant RC as "ResultCodeEnum"
participant R as "Result"
C->>Ctrl : "请求"
Ctrl->>Svc : "调用服务"
Svc-->>Ctrl : "返回数据或抛异常"
alt "无异常"
Ctrl->>R : "封装成功响应"
R-->>C : "返回"
else "有异常"
Ctrl->>EH : "抛出异常"
EH->>RC : "解析错误码"
EH->>R : "封装错误响应"
R-->>C : "返回"
end
```
图表来源
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
章节来源
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
## 依赖关系分析
- CommonConstants 被多处引用(HTTP、Header、DB 等),属于低耦合高内聚的基础常量集
- HasValueEnum 被具体枚举(如 StatusEnum)实现,体现“基类+实现”的枚举扩展模式
- ResultCodeEnum 与 Result/PageResult 紧密协作,构成统一的响应规范
- GlobalExceptionHandlerAdvice 依赖 ResultCodeEnum,确保异常到响应的映射一致性
```mermaid
graph LR
CC["CommonConstants"] --> |被引用| Any["任意模块"]
HVE["HasValueEnum"] --> |被实现| SE["StatusEnum"]
RCE["ResultCodeEnum"] --> |被使用| RES["Result"]
RCE --> |被使用| PAGERES["PageResult"]
GHA["GlobalExceptionHandlerAdvice"] --> |使用| RCE
GHA --> |返回| RES
```
图表来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
章节来源
- [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
- [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java)
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
## 性能考虑
- 枚举查找优化:对于频繁按值查找的枚举,可在初始化阶段构建 value->枚举的映射,将查找从 O(n) 降至 O(1)
- 常量访问:静态常量访问开销极低,但应避免在热点路径中进行不必要的字符串拼接
- 统一响应封装:Result/PageResult 的序列化成本可控,注意避免在循环中重复创建对象
- 异常处理:尽量减少异常抛出的频率,优先采用条件判断与返回值控制流程
[本节为通用性能建议,不直接分析具体文件]
## 故障排查指南
- 常见问题
- 错误码缺失或未定义:检查 ResultCodeEnum 是否已定义对应错误码,并在异常映射中补齐
- 枚举值不匹配:确认前端传递的枚举值与后端枚举定义一致,必要时增加 fromValue 的容错与提示
- 请求头不一致:核对 CommonConstants 中的 Header 常量是否与网关/前端保持一致
- 定位步骤
- 查看全局异常处理器日志,确认异常类型与错误码映射
- 检查 Result 返回的 code/message,对照 ResultCodeEnum 说明
- 验证枚举 fromValue 的实现是否正确覆盖所有业务值
- 修复建议
- 为新增枚举项补充映射与测试用例
- 在接口文档中更新错误码说明与示例
- 对关键路径增加断言与边界检查
章节来源
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
- [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java)
## 结论
- CommonConstants 提供了系统级常量的统一入口,有助于减少硬编码与不一致
- HasValueEnum 与 StatusEnum 构成了可扩展的枚举体系,便于业务建模与前后端协同
- ResultCodeEnum 与 Result/PageResult 形成了清晰的响应与错误码规范,配合全局异常处理提升稳定性与可观测性
- 建议团队在新增常量与枚举时遵循本文的最佳实践,确保一致性与可维护性
[本节为总结性内容,不直接分析具体文件]
## 附录
### 常量使用最佳实践
- 分类清晰:按功能域分组(HTTP、Header、DB、Cache、Time 等)
- 命名规范:常量名全大写、下划线分隔,语义明确
- 避免魔法值:禁止在业务代码中直接使用字符串/数字字面量
- 版本兼容:新增常量不影响既有行为,旧常量保留兼容性
### 自定义枚举创建指导
- 继承 HasValueEnum,定义业务值与描述字段
- 实现 fromValue(value) 方法,确保所有业务值均可反查
- 对非法值抛出明确的异常或返回空,便于上层处理
- 在单元测试中覆盖正常与异常路径
### 统一响应与错误码规范
- 成功响应:code=成功码,message=成功描述,data=业务数据
- 失败响应:code=错误码,message=用户可见的错误描述,data=null
- 分页响应:PageResult 包含列表、总数、页码等字段,仍遵循 code/message 规范
- 错误码分层:客户端错误(4xx)、服务端错误(5xx)、业务错误(自定义区间)
[本节为概念性指导,不直接分析具体文件]