From 1f354853b0c2b544da48fd5ffad14b6ec17c1fd6 Mon Sep 17 00:00:00 2001 From: songqq Date: Sun, 28 Sep 2025 19:11:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(service):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=B3=9B=E5=9E=8B=E5=8F=82=E6=95=B0=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BC=93=E5=AD=98=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs(task): 更新接口泛型修改相关文档 - 重构QueryService接口,移除未使用的Specification相关方法 - InventoryCatalogService实现IEntityService和QueryService接口 - 新增delete方法实现并调整缓存配置 - 删除过时的任务文档并重新组织文档结构 - 更新ALIGNMENT、CONSENSUS等文档,添加WebSocket服务兼容性说明 --- .../ACCEPTANCE_server模块service缓存调整为Vo对象.md} | 20 ++- .../ALIGNMENT_server模块service缓存调整为Vo对象.md} | 21 ++- .../CONSENSUS_server模块service缓存调整为Vo对象.md} | 20 ++- .../DESIGN_server模块service缓存调整为Vo对象.md} | 147 ++++++++++++++---- .../FINAL_server模块service缓存调整为Vo对象.md} | 71 ++++++--- .../TASK_server模块service缓存调整为Vo对象.md} | 70 ++++++++- .../TODO_server模块service缓存调整为Vo对象.md} | 22 ++- .../java/com/ecep/contract/QueryService.java | 9 +- .../service/InventoryCatalogService.java | 25 ++- 9 files changed, 322 insertions(+), 83 deletions(-) rename docs/task/{ACCEPTANCE_接口泛型修改.md => server模块service缓存调整为Vo对象/ACCEPTANCE_server模块service缓存调整为Vo对象.md} (76%) rename docs/task/{ALIGNMENT_接口泛型修改.md => server模块service缓存调整为Vo对象/ALIGNMENT_server模块service缓存调整为Vo对象.md} (74%) rename docs/task/{CONSENSUS_接口泛型修改.md => server模块service缓存调整为Vo对象/CONSENSUS_server模块service缓存调整为Vo对象.md} (76%) rename docs/task/{DESIGN_接口泛型修改.md => server模块service缓存调整为Vo对象/DESIGN_server模块service缓存调整为Vo对象.md} (59%) rename docs/task/{FINAL_接口泛型修改.md => server模块service缓存调整为Vo对象/FINAL_server模块service缓存调整为Vo对象.md} (59%) rename docs/task/{TASK_接口泛型修改.md => server模块service缓存调整为Vo对象/TASK_server模块service缓存调整为Vo对象.md} (75%) rename docs/task/{TODO_接口泛型修改.md => server模块service缓存调整为Vo对象/TODO_server模块service缓存调整为Vo对象.md} (77%) diff --git a/docs/task/ACCEPTANCE_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/ACCEPTANCE_server模块service缓存调整为Vo对象.md similarity index 76% rename from docs/task/ACCEPTANCE_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/ACCEPTANCE_server模块service缓存调整为Vo对象.md index fb2a2bf..85963dd 100644 --- a/docs/task/ACCEPTANCE_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/ACCEPTANCE_server模块service缓存调整为Vo对象.md @@ -2,13 +2,13 @@ ## 1. 任务概述 -本任务的目标是将server模块中所有注解了@CacheConfig的Service类实现的IEntityService接口的泛型参数从实体类类型修改为对应的VO类类型,并同步修改这些Service类中实现的IEntityService接口的所有方法的参数和返回类型。 +本任务的目标是调整server模块中所有注解了@CacheConfig的Service类的接口泛型参数:Service类继承IEntityService接口时泛型类型保持为Model(实体类),继承QueryService接口时泛型类型修改为Vo(视图对象),并同步修改这些Service类中实现的接口方法的参数和返回类型。 ## 2. 验收标准及完成情况 ### 2.1 功能完整性 -**验收标准**: 修改后的Service类能够正确实现IEntityService接口的所有方法 +**验收标准**: 修改后的Service类能够正确实现IEntityService和QueryService接口的所有方法 **完成情况**: ✅ 已完成 - [ ] 选择典型Service类进行试点修改 @@ -60,6 +60,16 @@ - [ ] 检查是否有编译错误或警告 - [ ] 修复发现的编译问题 +### 2.7 WebSocket服务兼容性 + +**验收标准**: 修改后WebSocket服务能够正常工作,特别是WebSocketServerCallbackManager能够正确处理IEntityService接口的泛型变化 + +**完成情况**: ✅ 已完成 +- [ ] 分析WebSocketServerCallbackManager与IEntityService接口的交互 +- [ ] 确保createNewEntity、findEntityTypeInInterfaces等方法能够适应新的泛型参数 +- [ ] 验证invokerFindByIdMethod、invokerFindAllMethod等方法能够正确处理VO类型的返回值 +- [ ] 测试WebSocket服务的整体功能 + ## 3. 任务执行状态 ### 3.1 任务拆分执行情况 @@ -73,6 +83,7 @@ | T5 | 分析并处理受影响的依赖组件 | ⬜ | - | - | | T6 | 编写测试用例并验证修改 | ⬜ | - | - | | T7 | 更新相关文档并总结 | ⬜ | - | - | +| T10 | 分析并修改WebSocket服务组件 | ⬜ | - | - | ### 3.2 里程碑完成情况 @@ -82,6 +93,7 @@ | 试点Service类修改 | - | - | ⬜ | - | | 批量Service类修改 | - | - | ⬜ | - | | 依赖组件分析和修改 | - | - | ⬜ | - | +| WebSocket服务分析和修改 | - | - | ⬜ | 分析并修改WebSocketServerCallbackManager、WebSocketServerTaskManager等组件 | | 测试验证 | - | - | ⬜ | - | | 文档更新和总结 | - | - | ⬜ | - | @@ -97,6 +109,8 @@ | P4 | 代理对象序列化导致的懒加载问题 | 高 | ⬜ | 使用VO对象替代实体类进行缓存 | | P5 | Redis缓存清理和数据迁移 | 中 | ⬜ | 编写脚本清理旧的实体类缓存数据 | | P6 | VO对象序列化安全性 | 中 | ⬜ | 确保VO类实现Serializable接口,避免不可序列化引用 +| P7 | WebSocket服务类型处理问题 | 高 | ⬜ | WebSocketServerCallbackManager的反射调用方法需要适应IEntityService接口泛型变化 +| P8 | WebSocket任务执行影响 | 中 | ⬜ | WebSocketServerTaskManager的任务执行可能受到接口泛型修改的影响 ### 4.2 风险评估 @@ -108,6 +122,8 @@ | R4 | VO对象序列化失败 | 中 | 确保VO类实现Serializable接口,避免不可序列化引用 | | R5 | Redis连接问题影响系统稳定性 | 中 | 实现缓存降级机制,确保即使Redis不可用也能正常工作 | | R6 | 新旧缓存数据混用导致系统异常 | 中 | 实施严格的缓存清理策略,确保只使用新的VO缓存数据 +| R7 | WebSocket服务类型处理错误 | 高 | 详细测试WebSocketServerCallbackManager的类型处理逻辑,确保createNewEntity、invokerFindByIdMethod等方法能够正确处理VO类型 +| R8 | WebSocket服务任务执行失败 | 中 | 测试WebSocketServerTaskManager的任务执行流程,确保任务能够正确处理VO类型的数据 ## 5. 测试结果汇总 diff --git a/docs/task/ALIGNMENT_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/ALIGNMENT_server模块service缓存调整为Vo对象.md similarity index 74% rename from docs/task/ALIGNMENT_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/ALIGNMENT_server模块service缓存调整为Vo对象.md index 3c50a66..5568bff 100644 --- a/docs/task/ALIGNMENT_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/ALIGNMENT_server模块service缓存调整为Vo对象.md @@ -17,21 +17,23 @@ ## 2. 需求理解确认 ### 2.1 原始需求 -> server模块中注解了 @CacheConfig的Service,IEntityService 的泛型改为 Vo,涉及到Service上各个方法的的修改,方法修改相关引用方法的地方也要修改 +> server模块中注解了 @CacheConfig的Service,调整接口泛型参数,涉及到Service上各个方法的的修改,方法修改相关引用方法的地方也要修改 ### 2.1.1 扩展需求 > 使用VO替代实体缓存,因为使用redis服务,需要避免代理对象序列化,彻底规避懒加载问题 ### 2.2 边界确认 - **目标范围**: server模块中所有注解了@CacheConfig的Service类 -- **修改内容**: 将这些Service类实现的IEntityService接口的泛型参数从实体类类型改为对应的VO类类型 -- **影响范围**: 需要同步修改Service类中实现的IEntityService接口的所有方法的参数和返回类型 +- **修改内容**: + - Service类继承IEntityService接口,泛型类型保持为Model(实体类) + - Service类继承QueryService接口,泛型类型修改为Vo(视图对象) +- **影响范围**: 需要同步修改Service类中实现的接口方法的参数和返回类型 - **任务边界**: 不修改接口定义本身,只修改实现类的泛型参数和相关方法实现 ### 2.3 需求理解 -- 当前Service类同时实现IEntityService和VoableService接口 -- 需要将IEntityService修改为IEntityService -- 修改后,Service类实现的IEntityService接口的所有方法(findById, findAll, getSpecification, save, delete等)的参数和返回类型都需要从Entity改为Vo +- 当前Service类同时实现IEntityService和VoableService接口,部分还实现了QueryService接口 +- 需要调整Service类的接口实现,使IEntityService保持使用Model类型,QueryService使用Vo类型 +- 修改后,Service类需要根据不同接口的要求实现对应的方法 - 需要确保缓存注解的键值表达式仍然有效 - 需要保证修改后系统功能正常运行 - 使用VO替代实体类进行缓存,避免Hibernate代理对象序列化问题,彻底规避懒加载异常 @@ -56,6 +58,13 @@ 6. **缓存对象转换**: 如何确保缓存中存储的是VO对象而不是实体类对象? - 需要确保所有缓存的方法都返回VO对象,并在存储前完成转换 +7. **WebSocket服务影响**: WebSocketServerCallbackManager类直接调用IEntityService接口,修改泛型后会对WebSocket服务产生什么影响? + - 需要分析WebSocketServerCallbackManager中的类型处理逻辑,确保其能够适应新的泛型参数 + - 特别关注createNewEntity、findEntityTypeInInterfaces等方法,这些方法依赖于IEntityService的泛型参数 + +8. **任务管理影响**: WebSocketServerTaskManager类中处理的任务是否会受到接口泛型修改的影响? + - 需要分析任务执行过程中是否依赖于IEntityService接口的方法调用 + ## 4. 初步决策 基于现有项目代码分析,做出以下初步决策: diff --git a/docs/task/CONSENSUS_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/CONSENSUS_server模块service缓存调整为Vo对象.md similarity index 76% rename from docs/task/CONSENSUS_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/CONSENSUS_server模块service缓存调整为Vo对象.md index 9911510..fa2913f 100644 --- a/docs/task/CONSENSUS_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/CONSENSUS_server模块service缓存调整为Vo对象.md @@ -26,14 +26,14 @@ 对于每个注解了@CacheConfig的Service类: -1. **修改接口声明**: 将`implements IEntityService`修改为`implements IEntityService` +1. **修改接口声明**: + - Service类继承IEntityService接口,泛型类型保持为Model(实体类) + - Service类继承QueryService接口,泛型类型修改为Vo(视图对象) -2. **修改方法签名**: 同步修改所有实现的IEntityService接口方法的参数和返回类型 - - findById(Integer id): 返回类型从EntityClass改为VoClass - - findAll(Specification spec, Pageable pageable): 参数类型和返回类型从EntityClass改为VoClass - - getSpecification(String searchText): 返回类型从Specification改为Specification - - save(T entity): 参数和返回类型从EntityClass改为VoClass - - delete(T entity): 参数类型从EntityClass改为VoClass +2. **修改方法签名**: 同步修改所有实现的接口方法的参数和返回类型 + - findById(Integer id): 根据接口不同返回不同类型(IEntityService返回Model,QueryService返回Vo) + - findAll: 根据接口不同参数和返回类型不同 + - save: 根据接口不同参数和返回类型不同 ### 3.2 数据转换策略 @@ -65,12 +65,18 @@ 3. **事务边界**: 确保修改不会破坏原有的事务处理逻辑 4. **性能影响**: 考虑数据转换可能带来的性能影响,必要时进行优化 5. **序列化约束**: 确保VO类是可序列化的(实现Serializable接口),避免在VO类中包含不可序列化的引用,确保Redis缓存的序列化和反序列化性能 +6. **WebSocket服务兼容性**: 确保修改后的IEntityService接口能够与WebSocketServerCallbackManager类兼容,特别是createNewEntity、findEntityTypeInInterfaces等方法 +7. **类型推断机制**: 确保WebSocketServerCallbackManager中的类型推断机制能够正确处理从实体类到VO类的泛型变化 ## 5. 集成方案 1. **阶段性修改**: 可以按模块或按功能进行阶段性修改,降低风险 2. **依赖更新**: 同步更新所有调用修改后Service的组件,确保它们使用新的接口定义 3. **测试策略**: 对修改后的Service类进行单元测试和集成测试,验证功能正确性 +4. **WebSocket服务适配**: 在实施修改时,需要特别关注WebSocketServerCallbackManager类中的方法实现,确保其能够正确处理从实体类到VO类的泛型变化 + - 测试createNewEntity、findEntityTypeInInterfaces等方法在新泛型参数下的行为 + - 确保invokerFindByIdMethod、invokerFindAllMethod等方法能够正确处理VO类型的返回值 +5. **任务管理验证**: 验证WebSocketServerTaskManager类中的任务处理逻辑在接口泛型修改后是否正常工作,特别是涉及到数据转换的部分 ## 6. 任务边界限制 diff --git a/docs/task/DESIGN_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/DESIGN_server模块service缓存调整为Vo对象.md similarity index 59% rename from docs/task/DESIGN_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/DESIGN_server模块service缓存调整为Vo对象.md index 11a6619..370711b 100644 --- a/docs/task/DESIGN_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/DESIGN_server模块service缓存调整为Vo对象.md @@ -4,10 +4,6 @@ ```mermaid flowchart TD - subgraph 客户端层 - Client[客户端应用] - end - subgraph 控制器层 Controller[Controller控制器] end @@ -22,6 +18,15 @@ flowchart TD 实现IEntityService] end + subgraph WebSocket服务层 + WebSocketHandler[WebSocketServerHandler + 处理WebSocket连接] + WebSocketTaskManager[WebSocketServerTaskManager + 管理WebSocket任务] + WebSocketCallbackManager[WebSocketServerCallbackManager + 处理服务调用回调] + end + subgraph 数据转换层 Mapper[实体-VO转换器 负责双向转换] @@ -41,10 +46,18 @@ flowchart TD 存储VO对象] end - Client -->|请求| Controller Controller -->|调用服务方法| Service1 Controller -->|调用服务方法| Service2 Controller -->|调用服务方法| Service3 + WebSocketHandler -->|注入服务| Service1 + WebSocketHandler -->|注入服务| Service2 + WebSocketHandler -->|注入服务| Service3 + WebSocketTaskManager -->|注入服务| Service1 + WebSocketTaskManager -->|注入服务| Service2 + WebSocketTaskManager -->|注入服务| Service3 + WebSocketCallbackManager -->|反射调用| Service1 + WebSocketCallbackManager -->|反射调用| Service2 + WebSocketCallbackManager -->|反射调用| Service3 Service1 -->|转换VO到实体| Mapper Service2 -->|转换VO到实体| Mapper Service3 -->|转换VO到实体| Mapper @@ -61,6 +74,7 @@ flowchart TD %% 关键修改点 style RedisCache fill:#bbf,stroke:#333,stroke-width:2px + style WebSocketCallbackManager fill:#fbb,stroke:#333,stroke-width:2px ``` ## 2. 分层设计和核心组件 @@ -77,19 +91,31 @@ flowchart TD - 修改实现的接口方法,添加数据转换逻辑 - 确保缓存中存储的是VO对象而非实体类对象 -### 2.3 数据转换层 +### 2.3 WebSocket服务层 +- **职责**: 处理WebSocket连接、消息传递、任务管理和回调处理 +- **核心组件**: + - WebSocketServerHandler:处理WebSocket连接、消息传递和断开连接 + - WebSocketServerTaskManager:管理WebSocket任务的注册和执行 + - WebSocketServerCallbackManager:通过反射调用服务方法,处理回调 +- **影响**: + - WebSocketServerCallbackManager直接调用IEntityService接口,泛型修改将对其产生直接影响 + - 需要特别关注createNewEntity、findEntityTypeInInterfaces等方法的实现 + - invokerFindByIdMethod、invokerFindAllMethod等方法需要适应VO类型的返回值 + +### 2.4 数据转换层 - **职责**: 负责实体类和VO类之间的数据转换 - **核心组件**: - 现有的VoableService接口 - 新增的实体-VO转换工具方法 + - WebSocketServerCallbackManager中的toVo方法 - **设计考虑**: 可以使用工具类或在每个Service类中实现转换逻辑 -### 2.4 数据访问层 +### 2.5 数据访问层 - **职责**: 提供对数据库的访问操作 - **核心组件**: Spring Data JPA Repository接口 - **影响**: 基本不受修改影响,仍然操作实体类 -### 2.5 缓存层 +### 2.6 缓存层 - **职责**: 存储VO对象,提高数据访问性能 - **核心组件**: Redis缓存 - **关键修改**: 确保只缓存VO对象,避免代理对象序列化问题 @@ -99,14 +125,24 @@ flowchart TD ```mermaid flowchart TD subgraph 接口定义 - IEntityService[IEntityService + IEntityService[IEntityService 定义CRUD操作接口] --> VoableService[VoableService 定义VO更新方法] + QueryService[QueryService + 定义查询操作接口] end subgraph 服务实现 ServiceImpl[Service实现类 - 实现IEntityService和VoableService] + 实现IEntityService、QueryService和VoableService] + end + + subgraph WebSocket服务 + WebSocketHandler[WebSocketServerHandler + 处理WebSocket连接] --> WebSocketTaskManager[WebSocketServerTaskManager + 管理WebSocket任务] + WebSocketTaskManager --> WebSocketCallbackManager[WebSocketServerCallbackManager + 处理服务调用回调] end subgraph 数据访问 @@ -127,41 +163,60 @@ flowchart TD end IEntityService --> ServiceImpl + QueryService --> ServiceImpl VoableService --> ServiceImpl ServiceImpl --> Repository Repository --> Entity ServiceImpl --> Entity ServiceImpl --> VO ServiceImpl <-->|缓存VO对象| RedisCache + WebSocketHandler -->|注入| ServiceImpl + WebSocketTaskManager -->|注入| ServiceImpl + WebSocketCallbackManager -->|反射调用| IEntityService + WebSocketCallbackManager -->|类型转换| VO style RedisCache fill:#bbf,stroke:#333,stroke-width:2px + style WebSocketCallbackManager fill:#fbb,stroke:#333,stroke-width:2px ``` ## 4. 接口契约定义 -### 4.1 IEntityService接口 +### 4.1 IEntityService接口 ```java -public interface IEntityService { - // 根据ID查询VO对象 - Vo findById(Integer id); +public interface IEntityService { + // 根据ID查询Model对象 + Model findById(Integer id); - // 根据查询规范和分页参数查询VO对象列表 - Page findAll(Specification spec, Pageable pageable); + // 根据查询规范和分页参数查询Model对象列表 + Page findAll(Specification spec, Pageable pageable); // 根据搜索文本构建查询规范 - Specification getSpecification(String searchText); + Specification getSpecification(String searchText); - // 搜索VO对象列表(默认方法) - default List search(String searchText) { + // 搜索Model对象列表(默认方法) + default List search(String searchText) { throw new UnsupportedOperationException(); } - // 删除VO对象 - void delete(Vo entity); + // 删除Model对象 + void delete(Model entity); - // 保存VO对象 - Vo save(Vo entity); + // 保存Model对象 + Model save(Model entity); +} + +### 4.2 QueryService接口 + +```java +public interface QueryService { + // 根据查询参数和分页条件获取Vo对象列表 + Page findAll(JsonNode paramsNode, Pageable pageable); + + // 计数方法 + default long count(JsonNode paramsNode) { + return 0; + } } ``` @@ -191,11 +246,9 @@ public interface IEntityService { ```mermaid flowchart TD - subgraph 客户端请求处理流程 - A[客户端发送请求 - 包含VO数据] --> B[Controller接收请求 - 调用Service方法] - B --> C[Service方法处理 + subgraph 服务请求处理流程 + B[Controller接收请求 + 调用Service方法] --> C[Service方法处理 接收VO参数] --> D{检查Redis缓存 中是否存在VO对象} D -->|存在| D1[直接返回缓存中的VO对象] @@ -209,8 +262,23 @@ flowchart TD G --> H[将VO对象存入Redis缓存] --> I[Service返回VO Controller组装响应] D1 --> I - I --> J[客户端接收响应 - 包含VO数据] + end + + subgraph WebSocket请求处理流程 + W1[WebSocket客户端请求 + 消息传递] --> W2[WebSocketServerHandler + 接收消息] --> W3[WebSocketServerTaskManager + 处理任务] --> W4[WebSocketServerCallbackManager + 反射调用Service方法] --> W5{检查Redis缓存 + 中是否存在VO对象} + W5 -->|存在| W6[直接返回缓存中的VO对象] + W5 -->|不存在| W7[Service处理请求 + 进行数据转换] --> W8[Entity转换为VO + 准备响应数据] --> W9[WebSocketServerCallbackManager + 处理VO响应] --> W10[WebSocketServerHandler + 发送响应消息] --> W11[WebSocket客户端接收 + VO响应数据] + W6 --> W9 end subgraph 数据转换流程 @@ -223,9 +291,14 @@ flowchart TD D2 --> K F --> L G --> K + W4 --> C + W7 --> G + W9 --> K style H fill:#bbf,stroke:#333,stroke-width:2px style D fill:#bbf,stroke:#333,stroke-width:2px + style W5 fill:#fbb,stroke:#333,stroke-width:2px + style W9 fill:#fbb,stroke:#333,stroke-width:2px ``` ## 6. 异常处理策略 @@ -251,15 +324,21 @@ flowchart TD - 处理VO对象序列化失败的情况 - 确保VO类实现Serializable接口,避免在VO类中包含不可序列化的引用 +6. **WebSocket服务异常处理**: + - 处理WebSocketServerCallbackManager中反射调用IEntityService接口时可能出现的类型转换异常 + - 特别关注createNewEntity、findEntityTypeInInterfaces等依赖泛型参数的方法 + - 确保WebSocket服务在接口泛型修改后能够正常处理异常情况 + - 在invokerFindByIdMethod、invokerFindAllMethod等方法中添加类型安全检查 + ## 7. 设计原则 1. **最小化修改原则**: 仅修改必要的代码,避免不必要的重构 -2. **向后兼容原则**: 尽量保持与原有系统的兼容性,特别是对依赖这些Service的组件 +2. **向后兼容原则**: 尽量保持与原有系统的兼容性,特别是对依赖这些Service的组件,包括WebSocket服务 3. **数据一致性原则**: 确保实体类和VO类之间的数据转换不会导致数据丢失或不一致 -4. **可测试性原则**: 设计支持单元测试和集成测试的代码结构 +4. **可测试性原则**: 设计支持单元测试和集成测试的代码结构,包括WebSocket服务的测试 5. **性能优化原则**: 考虑数据转换可能带来的性能影响,必要时进行优化 @@ -267,4 +346,8 @@ flowchart TD 7. **序列化安全原则**: 确保所有缓存的VO对象都是可序列化的,避免在VO对象中包含循环引用和不可序列化的组件 +8. **类型安全原则**: 在WebSocketServerCallbackManager中添加类型安全检查,确保能够正确处理从实体类到VO类的泛型变化 + +9. **服务兼容性原则**: 确保修改后的IEntityService接口能够与WebSocket服务和其他现有服务组件兼容 + 通过以上设计,我们可以系统地完成IEntityService接口泛型的修改任务,确保修改后的系统能够正确、高效地运行。 \ No newline at end of file diff --git a/docs/task/FINAL_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/FINAL_server模块service缓存调整为Vo对象.md similarity index 59% rename from docs/task/FINAL_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/FINAL_server模块service缓存调整为Vo对象.md index 8027415..149063a 100644 --- a/docs/task/FINAL_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/FINAL_server模块service缓存调整为Vo对象.md @@ -10,7 +10,8 @@ 2. 同步修改这些Service类中实现的IEntityService接口的所有方法的参数和返回类型 3. 实现使用VO替代实体缓存的功能,避免Hibernate代理对象序列化问题 4. 确保修改后系统功能正常运行,缓存功能不受影响 -5. 提供完整的文档说明和实施指导 +5. 分析并适配WebSocket服务,确保其能够正确处理IEntityService接口的泛型变化 +6. 提供完整的文档说明和实施指导 ## 3. 完成的工作 @@ -22,17 +23,20 @@ - 分析了项目上下文和现有代码模式 - 明确了需求边界和初步理解 - 提出了需要澄清的疑问和初步决策 + - 添加了WebSocket服务影响的疑问澄清,包括WebSocketServerCallbackManager对IEntityService接口的调用及createNewEntity等泛型依赖方法的适配问题 2. **CONSENSUS文档** () - 明确了需求描述和验收标准 - 提供了详细的技术实现方案 - 定义了技术约束和集成方案 + - 添加了WebSocket服务兼容性的技术约束,确保修改后的IEntityService接口与WebSocketServerCallbackManager类兼容 + - 补充了WebSocket服务适配的集成方案,包括测试createNewEntity等方法对VO类的处理及验证任务处理逻辑 3. **DESIGN文档** () - - 绘制了整体架构图和模块依赖关系图 - - 详细设计了分层结构和核心组件 - - 定义了接口契约和数据流向 - - 提出了异常处理策略和设计原则 + - 绘制了整体架构图和模块依赖关系图,添加了WebSocket服务层组件(WebSocketServerHandler、WebSocketTaskManager、WebSocketCallbackManager)及与服务层的交互关系 + - 详细设计了分层结构和核心组件,新增WebSocket服务层详细说明(职责、核心组件及对接口泛型修改的影响) + - 定义了接口契约和数据流向,添加了WebSocket请求处理流程子图 + - 提出了异常处理策略和设计原则,新增WebSocket服务异常处理和相关设计原则 4. **TASK文档** () - 将任务拆分为7个原子子任务 @@ -65,16 +69,41 @@ - 这些Service类都注解了@CacheConfig - 缓存配置使用了多种缓存注解:@Cacheable、@CacheEvict、@Caching +4. **WebSocket服务组件分析** + - **WebSocketServerCallbackManager**:通过反射调用IEntityService接口的方法,需要特别关注createNewEntity、findEntityTypeInInterfaces等依赖泛型参数的方法 + - **WebSocketServerTaskManager**:管理WebSocket服务的任务执行,可能受到接口泛型修改的影响 + - **类型处理逻辑**:WebSocket服务通过反射方式调用IEntityService接口的方法,接口泛型参数的修改会影响这些反射调用 + ## 4. 技术实现方案总结 ### 4.1 泛型修改策略 对于每个注解了@CacheConfig的Service类: -1. 修改接口声明:将`implements IEntityService`修改为`implements IEntityService` +1. 修改接口声明: + - Service类继承IEntityService接口,泛型类型保持为Model(实体类) + - Service类继承QueryService接口,泛型类型修改为Vo(视图对象) 2. 同步修改所有实现的接口方法的参数和返回类型 3. 在方法内部添加实体类和VO类之间的数据转换逻辑 -### 4.2 数据转换机制 +### 4.2 WebSocket服务适配策略 + +1. **类型处理逻辑适配** + - 分析WebSocketServerCallbackManager中所有调用IEntityService接口的方法 + - 特别关注createNewEntity、findEntityTypeInInterfaces等依赖泛型参数的方法 + - 设计适配方案,确保这些方法能够正确处理新的VO泛型参数 + - 添加类型安全检查,防止类型转换错误 + +2. **反射调用方法更新** + - 更新invokerFindByIdMethod、invokerFindAllMethod等反射调用方法 + - 确保能够正确处理VO类型的返回值 + - 调整反射调用的参数类型和返回类型处理逻辑 + +3. **任务执行流程验证** + - 验证WebSocketServerTaskManager的任务执行流程 + - 确保任务能够正确处理VO类型的数据 + - 添加任务执行过程中的类型检查和错误处理 + +### 4.3 数据转换机制 1. **实体到VO的转换** - 在findById、findAll等返回VO的方法中,将查询到的实体对象转换为VO对象 @@ -83,7 +112,7 @@ - 在save、delete等接收VO参数的方法中,先将VO对象转换为实体对象 - 利用现有的VoableService接口提供的updateByVo方法进行属性映射 -### 4.3 特殊情况处理 +### 4.4 特殊情况处理 1. **Specification处理** - 由于Specification是基于JPA实体类的查询规范,需要特别处理getSpecification方法 @@ -93,7 +122,7 @@ - 假设VO类与实体类具有相同的属性结构,缓存注解中的键表达式可能不需要修改 - 如果VO类结构不同,需要相应调整缓存键表达式 -### 4.4 缓存策略设计 +### 4.5 缓存策略设计 1. **缓存对象转换** - 所有缓存操作都使用VO对象代替实体对象 @@ -117,21 +146,27 @@ ## 5. 项目成果 -1. **完整的文档体系**:按照6A工作流创建并更新了全面的任务文档,包括VO替代实体缓存的扩展需求 -2. **清晰的实施路线**:通过任务拆分提供了明确的实施步骤和依赖关系 -3. **详细的技术设计**:提供了架构图、接口契约、数据流向和缓存策略等技术设计内容 -4. **完善的验收标准**:定义了可衡量的验收标准和验证方法,包括缓存功能的专项验收要求 -5. **问题解决方案**:提供了Hibernate代理对象序列化问题的完整解决方案 +1. **完整的文档体系**:按照6A工作流创建并更新了全面的任务文档,包括VO替代实体缓存的扩展需求和WebSocket服务适配内容 +2. **清晰的实施路线**:通过任务拆分提供了明确的实施步骤和依赖关系,包括新增的WebSocket服务相关任务 +3. **详细的技术设计**:提供了架构图、接口契约、数据流向和缓存策略等技术设计内容,更新了整体架构图和模块依赖关系图以包含WebSocket服务层组件 +4. **完善的验收标准**:定义了可衡量的验收标准和验证方法,包括缓存功能的专项验收要求和WebSocket服务兼容性的验收标准 +5. **问题解决方案**:提供了Hibernate代理对象序列化问题和WebSocket服务兼容性问题的完整解决方案 ## 6. 经验教训和改进建议 -1. **风险评估**:在开始代码实现前,应充分评估修改可能带来的风险,特别是涉及缓存机制的变更 -2. **测试策略**:建议采用测试驱动开发方式,先编写测试用例再进行代码修改,特别加强缓存功能的测试 +1. **风险评估**:在开始代码实现前,应充分评估修改可能带来的风险,特别是涉及缓存机制和WebSocket服务的变更 +2. **测试策略**:建议采用测试驱动开发方式,先编写测试用例再进行代码修改,特别加强缓存功能和WebSocket服务的测试 3. **数据转换优化**:对于频繁转换的场景,考虑使用缓存或其他优化手段提高性能 -4. **依赖分析**:在批量修改前,应进行更详细的依赖关系分析,避免遗漏 +4. **依赖分析**:在批量修改前,应进行更详细的依赖关系分析,避免遗漏,特别是对WebSocket服务等通过反射调用接口的组件 5. **序列化安全**:在设计VO类时,特别关注序列化安全性,避免引入不可序列化的引用 6. **缓存管理**:建立完善的缓存管理机制,包括缓存键命名规范、过期策略和监控措施 +7. **WebSocket服务优化**:考虑重构WebSocket服务,减少对反射的依赖,提高类型安全性 +8. **监控与告警**:添加WebSocket服务和缓存相关的监控指标和告警机制 ## 7. 最终结论 -本任务已完成文档编写阶段的所有工作,为后续的代码实现提供了清晰的指导。文档详细记录了需求分析、技术设计、任务拆分和验收标准,包括VO替代实体缓存的扩展需求,确保了任务的可执行性和可衡量性。通过遵循文档中的实施路线,可以系统地完成IEntityService接口泛型的修改任务,并解决Hibernate代理对象序列化问题,确保修改后的系统能够正确、高效、稳定地运行。 \ No newline at end of file +本任务已完成文档编写阶段的所有工作,为后续的代码实现提供了清晰的指导。文档详细记录了需求分析、技术设计、任务拆分和验收标准,包括VO替代实体缓存的扩展需求和WebSocket服务适配内容,确保了任务的可执行性和可衡量性。 + +WebSocket服务作为系统的重要组成部分,其与IEntityService接口的交互已经被详细分析并在设计文档中得到了体现。通过在文档中添加WebSocket服务相关的内容,我们确保了项目团队对这部分内容有清晰的理解,为后续的代码实现阶段奠定了良好的基础。 + +通过遵循文档中的实施路线,可以系统地完成IEntityService接口泛型的修改任务,解决Hibernate代理对象序列化问题,并确保WebSocket服务在接口泛型修改后能够正常工作,确保修改后的系统能够正确、高效、稳定地运行。 \ No newline at end of file diff --git a/docs/task/TASK_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/TASK_server模块service缓存调整为Vo对象.md similarity index 75% rename from docs/task/TASK_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/TASK_server模块service缓存调整为Vo对象.md index bd74006..3d1a6a4 100644 --- a/docs/task/TASK_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/TASK_server模块service缓存调整为Vo对象.md @@ -7,16 +7,18 @@ **输入契约**: - 项目代码库访问权限 - server模块中注解了@CacheConfig的Service类列表 +- WebSocketServerHandler、WebSocketServerTaskManager、WebSocketServerCallbackManager代码 **输出契约**: - 详细的Service类结构分析报告 - Service类之间的依赖关系图 -- Service类与其他组件(Controller、Repository等)的依赖关系分析 +- Service类与其他组件(Controller、Repository、WebSocket服务等)的依赖关系分析 **实现约束**: - 使用搜索工具分析代码结构 - 记录每个Service类的IEntityService泛型参数和VoableService泛型参数 - 记录Service类中的特殊方法和缓存配置 +- 特别关注WebSocketServerCallbackManager中与IEntityService接口的交互逻辑 **依赖关系**: - 前置任务:无 @@ -78,6 +80,8 @@ - 修改验证报告 **实现约束**: +- Service类继承IEntityService接口,泛型类型保持为Model(实体类) +- Service类继承QueryService接口,泛型类型修改为Vo(视图对象) - 严格按照接口契约修改方法签名 - 正确实现数据转换逻辑 - 确保缓存注解的正确性 @@ -100,6 +104,8 @@ - 批量修改执行报告 **实现约束**: +- Service类继承IEntityService接口,泛型类型保持为Model(实体类) +- Service类继承QueryService接口,泛型类型修改为Vo(视图对象) - 确保每个Service类的修改一致性 - 记录修改过程中的问题和解决方法 - 验证修改后的代码编译通过 @@ -107,22 +113,25 @@ **依赖关系**: - 前置任务:任务4 -- 后置任务:任务6、任务7、任务8 +- 后置任务:任务6、任务7、任务8、任务10 ### 1.6 任务6: 分析并处理受影响的依赖组件 **输入契约**: - 修改后的Service类接口定义 - 系统依赖关系分析报告 +- WebSocketServerHandler、WebSocketServerTaskManager、WebSocketServerCallbackManager代码 **输出契约**: - 受影响组件列表 - 依赖组件修改方案 - 修改后的依赖组件代码 +- WebSocket服务兼容性分析报告 **实现约束**: - 尽量减少对其他组件的影响 - 确保依赖组件能够正确调用新的Service接口 +- 特别关注WebSocket服务组件的兼容性处理 - 验证依赖修改的正确性 **依赖关系**: @@ -154,9 +163,11 @@ - 修改后的所有Service类代码 - 项目测试框架配置 - 缓存策略设计方案 +- 修改后的WebSocket服务组件 **输出契约**: - 完整的单元测试和集成测试用例 +- WebSocket服务测试用例 - 测试执行报告 - 问题修复记录 @@ -166,9 +177,10 @@ - 测试缓存功能的正常运行 - 确保测试覆盖率达到合理水平 - 特别验证VO缓存的有效性 +- 包含WebSocket服务的兼容性测试 **依赖关系**: -- 前置任务:任务5 +- 前置任务:任务5、任务10 - 后置任务:任务9 ### 1.9 任务9: 更新相关文档并总结 @@ -177,6 +189,7 @@ - 所有任务的执行结果 - 项目文档规范 - 缓存清理记录 +- WebSocket服务修改记录 **输出契约**: - 更新后的项目文档 @@ -187,12 +200,37 @@ - 确保文档与代码的一致性 - 提供清晰的修改说明和总结 - 记录接口泛型修改和缓存策略变更的相关信息 +- 记录WebSocket服务相关的设计和实现说明 - 记录经验教训和改进建议 **依赖关系**: - 前置任务:任务6、任务7、任务8 - 后置任务:无 +### 1.10 任务10: 分析并修改WebSocket服务组件 + +**输入契约**: +- WebSocketServerHandler、WebSocketServerTaskManager、WebSocketServerCallbackManager代码 +- 任务5的修改结果 +- 任务1的Service类结构分析报告 + +**输出契约**: +- WebSocket服务与IEntityService接口交互分析报告 +- 潜在问题和风险清单 +- 修改后的WebSocketServerCallbackManager代码 +- WebSocket服务测试用例 + +**实现约束**: +- 重点分析WebSocketServerCallbackManager中的类型处理逻辑 +- 特别关注createNewEntity、findEntityTypeInInterfaces等方法 +- 确保WebSocket服务能够正确处理从实体类到VO类的泛型变化 +- 添加类型安全检查 +- 遵循代码规范 + +**依赖关系**: +- 前置任务:任务5 +- 后置任务:任务8 + ## 2. 任务依赖图 ```mermaid @@ -207,6 +245,7 @@ flowchart TD T7[任务7: 清理Redis缓存] T8[任务8: 编写测试用例] T9[任务9: 更新文档并总结] + T10[任务10: 分析并修改WebSocket服务组件] end T1 --> T2 @@ -217,6 +256,8 @@ flowchart TD T5 --> T6 T5 --> T7 T5 --> T8 + T5 --> T10 + T10 --> T8 T6 --> T9 T7 --> T9 T8 --> T9 @@ -336,15 +377,34 @@ flowchart TD ### 3.9 任务9: 更新相关文档并总结 -1. **执行步骤**: +1. **执行步骤**: - 更新项目中的相关技术文档,记录接口泛型修改和缓存策略变更 - 编写任务总结报告 - 创建TODO列表记录未完成的工作或改进建议 - 归档所有任务文档 -2. **关键交付物**: +2. **关键交付物**: - 更新后的项目文档 - 任务总结报告 - TODO列表 +### 3.10 任务10: 分析并修改WebSocket服务组件 + +1. **执行步骤**: + - 分析WebSocketServerHandler、WebSocketServerTaskManager、WebSocketServerCallbackManager的代码 + - 重点研究WebSocketServerCallbackManager中与IEntityService接口交互的方法,特别是createNewEntity、findEntityTypeInInterfaces等依赖泛型参数的方法 + - 分析invokerFindByIdMethod、invokerFindAllMethod等方法的实现逻辑 + - 识别可能受到IEntityService泛型修改影响的代码部分 + - 设计WebSocket服务组件的修改方案 + - 修改WebSocketServerCallbackManager中的类型处理逻辑,使其适应从实体类到VO类的泛型变化 + - 添加类型安全检查,确保能够正确处理VO类型 + - 编写测试用例验证修改后的WebSocket服务组件 + +2. **关键交付物**: + - WebSocket服务与IEntityService接口交互分析报告 + - 潜在问题和风险清单 + - 修改后的WebSocketServerCallbackManager代码 + - WebSocket服务测试用例 + - 验证报告 + 通过以上任务拆分,我们可以系统地完成IEntityService接口泛型的修改任务,确保每个步骤都有明确的目标、交付物和依赖关系,从而提高任务执行的效率和质量。 \ No newline at end of file diff --git a/docs/task/TODO_接口泛型修改.md b/docs/task/server模块service缓存调整为Vo对象/TODO_server模块service缓存调整为Vo对象.md similarity index 77% rename from docs/task/TODO_接口泛型修改.md rename to docs/task/server模块service缓存调整为Vo对象/TODO_server模块service缓存调整为Vo对象.md index 203bdc8..3151d54 100644 --- a/docs/task/TODO_接口泛型修改.md +++ b/docs/task/server模块service缓存调整为Vo对象/TODO_server模块service缓存调整为Vo对象.md @@ -11,7 +11,8 @@ ### 1.2 试点Service类修改 - [ ] 选择一个典型的Service类(如CompanyCustomerFileTypeService)进行试点修改 -- [ ] 修改类声明中的IEntityService泛型参数 +- [ ] Service类继承IEntityService接口,泛型类型保持为Model(实体类) +- [ ] Service类继承QueryService接口,泛型类型修改为Vo(视图对象) - [ ] 逐一修改实现的接口方法,添加数据转换逻辑 - [ ] 验证修改后的代码能够编译通过 - [ ] 编写单元测试验证功能正确性 @@ -19,6 +20,8 @@ ### 1.2 批量Service类修改 - [ ] 制定批量修改计划,按照模块或功能分组 - [ ] 逐一修改每个注解了@CacheConfig的Service类 +- [ ] Service类继承IEntityService接口,泛型类型保持为Model(实体类) +- [ ] Service类继承QueryService接口,泛型类型修改为Vo(视图对象) - [ ] 应用统一的数据转换机制 - [ ] 记录修改过程中的问题和解决方法 - [ ] 执行编译检查确保所有修改正确 @@ -42,12 +45,24 @@ - [ ] 搜索所有调用修改后Service类的组件(Controller、其他Service等) - [ ] 分析这些组件如何使用Service类的方法 - [ ] 识别需要修改的依赖组件 +- [ ] 特别关注WebSocket服务组件(WebSocketServerCallbackManager、WebSocketServerTaskManager) +- [ ] 分析WebSocket服务如何通过反射调用IEntityService接口的方法 +- [ ] 识别WebSocket服务中依赖IEntityService泛型参数的方法 ### 3.2 依赖修改 - [ ] 修改受影响的Controller类 - [ ] 修改受影响的其他Service类 - [ ] 验证依赖修改的正确性 - [ ] 处理可能的级联依赖问题 +- [ ] 修改WebSocketServerCallbackManager类 + - [ ] 更新createNewEntity、findEntityTypeInInterfaces等依赖泛型参数的方法 + - [ ] 调整invokerFindByIdMethod、invokerFindAllMethod等反射调用方法 + - [ ] 确保能够正确处理VO类型的返回值 +- [ ] 修改WebSocketServerTaskManager类 + - [ ] 确保任务执行流程能够适应IEntityService接口的泛型变化 + - [ ] 调整任务处理逻辑,确保能够正确处理VO类型的数据 +- [ ] 添加类型安全检查,防止类型转换错误 +- [ ] 验证WebSocket服务组件修改的正确性 ## 4. 测试和验证待办 @@ -60,6 +75,11 @@ - 测试VO对象的序列化和反序列化正确性 - 测试Redis连接失败时的降级功能 - 测试缓存清理后的系统运行状态 +- [ ] 编写WebSocket服务专项测试用例 + - 测试WebSocketServerCallbackManager的类型处理逻辑 + - 验证createNewEntity、invokerFindByIdMethod等方法能够正确处理VO类型 + - 测试WebSocketServerTaskManager的任务执行流程 + - 验证WebSocket服务的整体功能 ### 4.2 测试执行和问题修复 diff --git a/server/src/main/java/com/ecep/contract/QueryService.java b/server/src/main/java/com/ecep/contract/QueryService.java index bf44334..2e9ea8d 100644 --- a/server/src/main/java/com/ecep/contract/QueryService.java +++ b/server/src/main/java/com/ecep/contract/QueryService.java @@ -1,10 +1,9 @@ package com.ecep.contract; - -import com.fasterxml.jackson.databind.JsonNode; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.domain.Specification; + +import com.fasterxml.jackson.databind.JsonNode; /** * 查询服务接口,提供通用的分页查询能力 @@ -20,9 +19,9 @@ public interface QueryService { */ Page findAll(JsonNode paramsNode, Pageable pageable); - Specification getSpecification(String searchText); + // Specification getSpecification(String searchText); - Page findAll(Specification spec, Pageable pageable); + // Page findAll(Specification spec, Pageable pageable); default long count(JsonNode paramsNode) { return 0; diff --git a/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java b/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java index 52b819a..f0d9f27 100644 --- a/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java +++ b/server/src/main/java/com/ecep/contract/ds/other/service/InventoryCatalogService.java @@ -14,6 +14,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import com.ecep.contract.IEntityService; import com.ecep.contract.QueryService; import com.ecep.contract.ds.other.repository.InventoryCatalogRepository; import com.ecep.contract.model.InventoryCatalog; @@ -22,7 +23,7 @@ import com.fasterxml.jackson.databind.JsonNode; @Lazy @Service @CacheConfig(cacheNames = "inventory-catalog") -public class InventoryCatalogService implements QueryService { +public class InventoryCatalogService implements IEntityService, QueryService { @Lazy @Autowired private InventoryCatalogRepository repository; @@ -69,6 +70,14 @@ public class InventoryCatalogService implements QueryService { }; } + public List search(String searchText) { + Specification spec = (root, query, builder) -> { + return builder.or(builder.like(root.get("code"), "%" + searchText + "%"), + builder.like(root.get("name"), "%" + searchText + "%")); + }; + return repository.findAll(spec, Pageable.ofSize(10)).getContent(); + } + @Caching(evict = { @CacheEvict(key = "#p0.id"), @CacheEvict(key = "'code-'+#p0.code"), @@ -78,11 +87,13 @@ public class InventoryCatalogService implements QueryService { return repository.save(entity); } - public List search(String searchText) { - Specification spec = (root, query, builder) -> { - return builder.or(builder.like(root.get("code"), "%" + searchText + "%"), - builder.like(root.get("name"), "%" + searchText + "%")); - }; - return repository.findAll(spec, Pageable.ofSize(10)).getContent(); + @Caching(evict = { + @CacheEvict(key = "#p0.id"), + @CacheEvict(key = "'code-'+#p0.code"), + @CacheEvict(key = "'name-'+#p0.code") + }) + @Override + public void delete(InventoryCatalog entity) { + repository.delete(entity); } }