# 架构决策记录 (ADR) - 基础设施和枚举定义 ## 背景 REQ-011-1 需求要求在 datai-salesforce-common 模块定义文件上传下载所需的基础设施,包括: - 文件对象类型枚举(FileObjectType) - 文件上传下载参数类(DTO/VO) - 文件上传下载异常类 - 文件验证工具类 这些基础设施将被后续的文件上传下载功能(REQ-011-2/3/4/5/6)使用,需要确保设计的合理性和可扩展性。 **约束条件**: - 必须基于现有的 Spring Boot 3 技术栈 - 必须遵循 Authentication.canvas 中定义的架构和调用关系 - 必须在 datai-salesforce-common 模块下实现 - 必须遵循 SSOT 方法论 **业务需求**: - 支持 Attachment、ContentDocument、Document 三种文件对象类型 - 提供统一的参数验证和响应封装 - 提供完善的异常处理机制 - 支持文件大小和类型验证 ## 决策 采用**策略模式 + 枚举 + 统一异常处理**的架构设计方案: 1. **文件对象类型枚举(FileObjectType)**: - 使用 Java 枚举定义 ATTACHMENT、CONTENT_DOCUMENT、DOCUMENT 三个枚举值 - 每个枚举值包含:描述、文件大小限制、推荐等级、API 类型、必填字段等元数据 - 提供静态方法进行枚举值与字符串的转换 - 提供获取文件大小限制和推荐等级的方法 2. **参数类设计**: - FileUploadRequest:包含组织配置 ID、文件对象类型、文件、关联记录 ID、文件名、描述等字段 - FileDownloadRequest:包含组织配置 ID、文件对象类型、文件 ID、保存路径等字段 - FileUploadResponse:包含文件 ID、文件名、文件大小、文件类型、上传时间、操作状态等字段 - FileDownloadResponse:包含文件名、文件大小、保存路径、下载时间、操作状态等字段 - 使用 Lombok 注解简化代码(@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor) - 使用 JSR-303 验证注解(@NotNull、@NotBlank、@Size、@Valid) 3. **异常类设计**: - 继承自 datai-salesforce-common 模块的 RuntimeException 基类 - 提供错误代码枚举(FileErrorCode) - 每个异常类包含:错误代码、错误消息、异常链(cause) - 异常类包括:FileUploadException、FileDownloadException、FileSizeExceededException、FileTypeNotSupportedException、FileObjectNotFoundException、OrgConfigNotFoundException、FileValidationException 4. **验证工具类设计**: - FileValidationUtils:提供文件大小验证、文件类型验证、文件名验证、文件扩展名获取、文件 MIME 类型获取等静态方法 - 使用 Apache Tika 获取文件 MIME 类型 - 提供可配置的文件大小限制和文件类型白名单 ## 备选方案 ### 方案一:策略模式 + 枚举 + 统一异常处理(已选择) **优点**: - 枚举提供类型安全和编译时检查 - 策略模式易于扩展新的文件对象类型 - 统一异常处理机制便于维护 - 参数类使用 Lombok 和 JSR-303 注解,代码简洁 - 验证工具类提供可复用的验证逻辑 **缺点**: - 需要引入 Apache Tika 依赖 - 枚举扩展需要修改代码 ### 方案二:配置文件 + 反射 + 动态验证 **优点**: - 文件对象类型配置化,无需修改代码即可扩展 - 验证规则可配置,灵活性高 **缺点**: - 失去编译时类型安全 - 反射影响性能 - 配置复杂度增加 - 维护成本高 ### 方案三:继承体系 + 抽象类 **优点**: - 面向对象设计,符合 OOP 原则 - 可以通过继承扩展功能 **缺点**: - 类层次结构复杂 - 三种文件对象类型差异较大,难以抽象 - 违反"组合优于继承"原则 ## 影响 ### 系统架构影响 1. **datai-salesforce-common 模块**: - 新增枚举类:FileObjectType - 新增参数类:FileUploadRequest、FileDownloadRequest、FileUploadResponse、FileDownloadResponse - 新增异常类:FileUploadException、FileDownloadException、FileSizeExceededException、FileTypeNotSupportedException、FileObjectNotFoundException、OrgConfigNotFoundException、FileValidationException - 新增错误代码枚举:FileErrorCode - 新增工具类:FileValidationUtils 2. **依赖管理**: - 需要引入 Apache Tika 依赖(用于文件 MIME 类型检测) - 需要引入 Lombok 依赖(如果尚未引入) - 需要引入 Spring Validation 依赖(如果尚未引入) ### 开发流程影响 1. **后续子需求开发**: - REQ-011-2/3/4 可以直接使用 FileObjectType 枚举 - REQ-011-2/3/4 可以直接使用 FileUploadRequest 和 FileDownloadRequest - REQ-011-2/3/4 可以直接使用 FileUploadResponse 和 FileDownloadResponse - REQ-011-2/3/4 可以直接使用异常类和验证工具类 2. **测试流程**: - 需要为枚举类编写单元测试 - 需要为参数类编写单元测试 - 需要为异常类编写单元测试 - 需要为验证工具类编写单元测试 ### 运维管理影响 1. **配置管理**: - 文件大小限制和文件类型白名单可以通过配置文件管理 - 无需修改代码即可调整验证规则 2. **日志管理**: - 异常类提供详细的错误信息和错误代码 - 便于日志分析和问题排查 ## 风险 ### 技术风险 1. **Apache Tika 依赖冲突**: - 风险描述:Apache Tika 可能与项目现有依赖冲突 - 影响程度:中 - 缓解措施:使用 Maven 依赖树检查冲突,必要时使用 exclusions 2. **枚举扩展性**: - 风险描述:未来可能需要支持更多文件对象类型,需要修改枚举 - 影响程度:低 - 缓解措施:枚举设计时考虑扩展性,提供清晰的扩展文档 ### 业务风险 1. **文件大小限制调整**: - 风险描述:Salesforce 可能调整文件大小限制 - 影响程度:低 - 缓解措施:文件大小限制配置化,便于调整 2. **文件类型白名单维护**: - 风险描述:文件类型白名单需要定期维护 - 影响程度:低 - 缓解措施:提供配置文件,便于运维人员维护 ### 实施风险 1. **参数验证复杂性**: - 风险描述:参数验证逻辑可能过于复杂 - 影响程度:中 - 缓解措施:使用 JSR-303 验证注解,简化验证逻辑 2. **异常类设计不完善**: - 风险描述:异常类设计可能不够完善,遗漏某些异常场景 - 影响程度:中 - 缓解措施:参考现有的异常类定义,提供详细的错误代码 ## 回滚策略 如果决策实施后出现问题,可以采用以下回滚策略: 1. **Apache Tika 依赖冲突**: - 回滚方案:移除 Apache Tika 依赖,使用 Java 内置的 Files.probeContentType() 方法 - 回滚步骤: 1. 在 pom.xml 中移除 Apache Tika 依赖 2. 修改 FileValidationUtils,使用 Files.probeContentType() 方法 3. 重新编译和测试 2. **枚举扩展性不足**: - 回滚方案:将枚举改为配置文件 + 反射 - 回滚步骤: 1. 创建 file-object-types.yml 配置文件 2. 修改 FileObjectType 为配置类 3. 使用反射动态加载配置 4. 重新编译和测试 3. **参数验证逻辑复杂**: - 回滚方案:简化参数验证,只保留核心验证逻辑 - 回滚步骤: 1. 移除复杂的自定义验证注解 2. 只保留 JSR-303 基础验证注解 3. 重新编译和测试 ## 验收标准 定义验证该决策有效性的具体标准和测试方法: 1. **功能验证**: - [ ] FileObjectType 枚举包含 ATTACHMENT、CONTENT_DOCUMENT、DOCUMENT 三个枚举值 - [ ] FileObjectType 枚举提供描述、文件大小限制、推荐等级等元数据 - [ ] FileObjectType 枚举提供枚举值与字符串的转换方法 - [ ] FileUploadRequest 包含所有必需字段 - [ ] FileDownloadRequest 包含所有必需字段 - [ ] FileUploadResponse 包含所有必需字段 - [ ] FileDownloadResponse 包含所有必需字段 - [ ] 所有异常类继承自 RuntimeException - [ ] 所有异常类提供错误代码和错误消息 - [ ] FileValidationUtils 提供所有必需的验证方法 2. **代码质量验证**: - [ ] 代码符合项目编码规范 - [ ] 代码有清晰的注释 - [ ] 代码通过 SonarQube 静态代码分析 - [ ] 代码通过 Checkstyle 检查 3. **单元测试验证**: - [ ] FileObjectType 枚举单元测试覆盖率 ≥ 90% - [ ] 参数类单元测试覆盖率 ≥ 90% - [ ] 异常类单元测试覆盖率 ≥ 90% - [ ] FileValidationUtils 单元测试覆盖率 ≥ 90% 4. **集成测试验证**: - [ ] 后续子需求(REQ-011-2/3/4)能够正常使用这些基础设施 - [ ] 文件上传下载功能能够正常工作 ## 视觉锚点 ### Visual Reference 引用 Canvas 的具体节点或快照: - [Authentication.canvas](../../Authentication.canvas) - 相关架构图 - **具体节点**: [通用常量](node_common_constant) - 定义Salesforce相关的常量 - **具体节点**: [通用异常](node_common_exception) - 定义Salesforce相关的异常类 ### Status - [x] Draft - [ ] Accepted - [ ] Superceded ## 参考资料 列出与该决策相关的参考资料,包括文档、文章或其他资源: 1. [REQ-011.md](../requirements/REQ-011.md) - 父需求文档 2. [REQ-011-1.md](../requirements/REQ-011-1.md) - 子需求文档 3. [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示 4. [Attachment文件上传.md](../reference-code/data-dump/Attachment文件上传.md) - Salesforce Attachment 上传实现逻辑 5. [Attachment文件下载.md](../reference-code/data-dump/Attachment文件下载.md) - Salesforce Attachment 下载实现逻辑 6. [Document上传下载.md](../reference-code/data-dump/Document上传下载.md) - Salesforce Document 上传下载实现逻辑 7. [ContentVersion上传下载.md](../reference-code/data-dump/ContentVersion上传下载.md) - Salesforce ContentVersion 上传下载实现逻辑 8. [大文件上传下载.md](../reference-code/data-dump/大文件上传下载.md) - 大文件上传下载实现逻辑 9. [CommonServiceImpl.java](../reference-code/data-dump/CommonServiceImpl.java) - 现有的文件上传下载实现逻辑 10. [DataImportNewServiceImpl.java](../reference-code/data-dump/DataImportNewServiceImpl.java) - 现有的文件上传下载实现逻辑 11. [Java 枚举最佳实践](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) - Oracle 官方文档 12. [JSR-303 Bean Validation](https://beanvalidation.org/2.0/spec/) - Bean Validation 规范 13. [Apache Tika 文档](https://tika.apache.org/) - Apache Tika 官方文档 14. [Lombok 文档](https://projectlombok.org/) - Lombok 官方文档