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.
 
 
 
 
 
 

15 KiB

工具类库

**本文引用的文件** - [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java) - [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java) - [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java) - [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java) - [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java) - [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 crm-backend-matt 项目的通用工具类库,聚焦以下常用工具:

  • PageConverter 分页转换器
  • BeanCopyUtils 对象拷贝工具
  • EnumUtils 枚举工具
  • ExcelUtil Excel 处理工具
  • TreeUtils 树结构处理工具
  • AssertUtils 断言工具

文档从系统架构、组件职责、数据流与调用流程、API 说明、使用示例、性能考量与常见问题等方面展开,帮助读者快速理解并正确使用这些工具。

项目结构

工具类均位于基础模块的 utils 包中,彼此独立、低耦合,便于在业务模块中按需引入。

graph TB
subgraph "基础模块"
A["utils.PageConverter"]
B["utils.BeanCopyUtils"]
C["utils.EnumUtils"]
D["utils.ExcelUtil"]
E["utils.TreeUtils"]
F["utils.AssertUtils"]
end
G["业务模块<br/>controller/service/mapper"]
G --> A
G --> B
G --> C
G --> D
G --> E
G --> F

图表来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

章节来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

核心组件

  • PageConverter:将数据库分页结果转换为统一的分页响应结构,支持字段映射与类型转换。
  • BeanCopyUtils:提供高性能的对象属性拷贝能力,支持忽略空值、指定字段拷贝等场景。
  • EnumUtils:封装枚举的常见操作,如按名称/值获取枚举、校验存在性、批量转换等。
  • ExcelUtil:封装 Excel 读写能力(导入导出),支持表头映射、列过滤、异常聚合等。
  • TreeUtils:对扁平列表进行树形结构组装,支持层级深度控制与排序策略。
  • AssertUtils:统一的参数与业务前置断言工具,集中错误信息输出。

章节来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

架构总览

工具类作为横切能力被各层复用,典型调用链如下:

sequenceDiagram
participant C as "控制器/服务"
participant PC as "PageConverter"
participant BC as "BeanCopyUtils"
participant EU as "EnumUtils"
participant EX as "ExcelUtil"
participant TU as "TreeUtils"
participant AU as "AssertUtils"
C->>AU : "参数校验/业务断言"
C->>EU : "枚举解析/转换"
C->>BC : "对象属性拷贝"
C->>PC : "分页结果转换"
C->>EX : "Excel 导入/导出"
C->>TU : "树结构组装"

图表来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

详细组件分析

PageConverter 分页转换器

  • 职责
    • 将数据库分页对象转换为统一的分页响应结构。
    • 支持字段映射、类型转换、空值处理。
  • 关键 API
    • 分页转换入口方法:接收源分页对象与目标类型,返回分页结果。
    • 可选配置:是否包含总数、是否过滤空集合、自定义字段映射规则。
  • 使用示例
    • 在 Service 层查询后调用转换方法,直接返回给 Controller。
    • 结合 BeanCopyUtils 完成复杂 DTO 映射。
  • 性能考虑
    • 避免在循环内重复创建映射器;优先复用静态实例或缓存映射规则。
    • 大数据量分页时,注意只取必要字段,减少内存占用。
  • 错误处理
    • 当源分页为空或目标类型不匹配时,应返回空分页或抛出明确异常。
flowchart TD
Start(["进入转换"]) --> CheckInput["检查输入是否为空"]
CheckInput --> |为空| ReturnEmpty["返回空分页"]
CheckInput --> |非空| MapFields["执行字段映射/类型转换"]
MapFields --> BuildResult["构建分页结果对象"]
BuildResult --> ReturnResult["返回分页结果"]

图表来源

  • PageConverter.java

章节来源

  • PageConverter.java

BeanCopyUtils 对象拷贝工具

  • 职责
    • 高效拷贝对象属性,支持忽略空值、指定字段拷贝、嵌套对象拷贝等。
  • 关键 API
    • 单对象拷贝:源对象到目标对象。
    • 批量拷贝:集合到集合。
    • 选择性拷贝:白名单/黑名单字段控制。
  • 使用示例
    • Entity 转 DTO、DTO 转 VO、请求参数到领域模型。
  • 性能考虑
    • 反射开销较大,建议对热点路径做缓存或预编译映射。
    • 大对象频繁拷贝时,优先考虑构造器或 Builder 模式。
  • 错误处理
    • 类型不匹配或缺失字段时,记录日志并跳过或抛出明确异常。
classDiagram
class BeanCopyUtils {
+copy(source, target)
+copyList(list, targetType)
+copySelective(source, target, includeFields)
-buildFieldMap()
-applyValue(src, dest, field)
}

图表来源

  • BeanCopyUtils.java

章节来源

  • BeanCopyUtils.java

EnumUtils 枚举工具

  • 职责
    • 提供枚举的查找、校验、转换等通用能力。
  • 关键 API
    • 按名称获取枚举。
    • 按值获取枚举。
    • 校验枚举是否存在。
    • 批量字符串转枚举列表。
  • 使用示例
    • 接口入参为字符串时,先通过工具转为枚举再进行业务处理。
  • 性能考虑
    • 枚举查找应为 O(1),内部通常基于 Map 缓存。
    • 避免在热路径重复创建 Map。
  • 错误处理
    • 找不到对应枚举时,抛出明确的异常或返回 Optional。
flowchart TD
S(["传入名称/值"]) --> Lookup{"查找成功?"}
Lookup --> |是| ReturnEnum["返回枚举"]
Lookup --> |否| RaiseError["抛出未找到异常"]

图表来源

  • EnumUtils.java

章节来源

  • EnumUtils.java

ExcelUtil Excel 处理

  • 职责
    • 封装 Excel 导入导出,支持表头映射、列过滤、批量写入、异常聚合。
  • 关键 API
    • 导出:将集合数据导出为 Excel 文件流。
    • 导入:读取 Excel 并映射为对象集合。
    • 配置:列名映射、必填校验、默认值填充。
  • 使用示例
    • 管理后台导出报表、批量导入用户数据。
  • 性能考虑
    • 大数据导出建议使用流式写入,避免一次性加载到内存。
    • 导入时限制行数与列数,防止恶意文件导致 OOM。
  • 错误处理
    • 行级错误聚合,返回失败明细以便前端提示。
sequenceDiagram
participant U as "调用方"
participant EX as "ExcelUtil"
participant FS as "文件系统/流"
U->>EX : "导出/导入请求"
EX->>FS : "生成/读取流"
FS-->>EX : "字节流"
EX-->>U : "文件流/对象集合"

图表来源

  • ExcelUtil.java

章节来源

  • ExcelUtil.java

TreeUtils 树结构处理

  • 职责
    • 将扁平列表组装为树形结构,支持层级深度、排序策略、根节点识别。
  • 关键 API
    • 列表转树:根据父 ID 关联构建。
    • 树遍历:前序/后序遍历、过滤子树。
    • 排序:按权重或时间排序。
  • 使用示例
    • 菜单树、部门树、分类树等。
  • 性能考虑
    • 使用 Map 缓存子节点,避免 N^2 复杂度。
    • 大数据集建议分批组装或限制层级深度。
  • 错误处理
    • 检测到环引用或非法父 ID 时,抛出明确异常。
flowchart TD
L(["扁平列表"]) --> BuildMap["构建ID->节点映射"]
BuildMap --> LinkChildren["按父ID链接子节点"]
LinkChildren --> SortNodes["按策略排序"]
SortNodes --> RootFilter["筛选根节点"]
RootFilter --> ReturnTree["返回树结构"]

图表来源

  • TreeUtils.java

章节来源

  • TreeUtils.java

AssertUtils 断言工具

  • 职责
    • 统一的参数与业务前置断言,集中错误信息输出。
  • 关键 API
    • 非空断言、条件断言、范围断言、枚举存在断言。
  • 使用示例
    • 在 Service 入口处校验入参合法性。
  • 性能考虑
    • 断言仅在调试或开启校验时生效,生产环境可关闭以减少开销。
  • 错误处理
    • 抛出统一异常类型,便于全局异常处理器捕获。
flowchart TD
A(["断言条件"]) --> Check{"条件满足?"}
Check --> |是| Pass["通过"]
Check --> |否| Throw["抛出断言异常"]

图表来源

  • AssertUtils.java

章节来源

  • AssertUtils.java

依赖关系分析

工具类之间保持松耦合,主要依赖第三方库(如 Excel 处理)与基础类型。典型依赖如下:

graph LR
PC["PageConverter"] --> BC["BeanCopyUtils"]
EX["ExcelUtil"] --> IO["IO/流"]
TU["TreeUtils"] --> COL["集合/Map"]
AU["AssertUtils"] --> ERR["异常类型"]
EU["EnumUtils"] --> MAP["Map缓存"]

图表来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

章节来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

性能考虑

  • 反射与映射
    • BeanCopyUtils 的反射开销较高,建议在热点路径缓存字段映射或使用代码生成方案。
  • 内存与流式处理
    • ExcelUtil 导出大文件时使用流式写入,避免一次性加载全部数据。
  • 数据结构优化
    • TreeUtils 使用 Map 缓存子节点,确保线性时间复杂度。
  • 枚举查找
    • EnumUtils 内部使用 Map 缓存,保证 O(1) 查找。
  • 分页转换
    • PageConverter 应避免不必要的深拷贝,仅复制必要字段。

[本节为通用指导,不直接分析具体文件]

故障排查指南

  • 分页转换结果为空
    • 检查源分页对象是否为空,确认字段映射是否正确。
  • 对象拷贝缺失字段
    • 确认目标对象存在 setter 或字段可见性,必要时启用选择性拷贝。
  • 枚举转换失败
    • 检查枚举名称/值大小写与空格,确认枚举定义完整。
  • Excel 导入失败
    • 查看行级错误聚合信息,定位具体行列问题;限制文件大小与行数。
  • 树结构出现环引用
    • 检查父 ID 指向是否合法,增加环检测逻辑。
  • 断言异常频繁触发
    • 检查上游参数校验逻辑,确认断言条件是否符合预期。

章节来源

  • PageConverter.java
  • BeanCopyUtils.java
  • EnumUtils.java
  • ExcelUtil.java
  • TreeUtils.java
  • AssertUtils.java

结论

上述工具类覆盖了分页转换、对象拷贝、枚举处理、Excel 读写、树结构组装与参数断言等高频场景。通过统一的 API 与良好的错误处理,能够显著提升开发效率与代码质量。在生产环境中,建议关注性能优化与资源限制,确保稳定性与可扩展性。

[本节为总结性内容,不直接分析具体文件]

附录

  • 最佳实践
    • 在 Service 层统一使用 AssertUtils 进行参数校验。
    • 对热点对象拷贝路径进行性能分析与缓存优化。
    • Excel 导入导出需设置超时与大小限制,防止资源耗尽。
    • 树结构构建前进行数据合法性校验,避免环引用。
    • 分页转换时仅选择必要字段,降低内存压力。

[本节为补充性内容,不直接分析具体文件]