refactor(service): 调整接口泛型参数并优化缓存策略

docs(task): 更新接口泛型修改相关文档

- 重构QueryService接口,移除未使用的Specification相关方法
- InventoryCatalogService实现IEntityService和QueryService接口
- 新增delete方法实现并调整缓存配置
- 删除过时的任务文档并重新组织文档结构
- 更新ALIGNMENT、CONSENSUS等文档,添加WebSocket服务兼容性说明
This commit is contained in:
2025-09-28 19:11:53 +08:00
parent b03b5385a5
commit 1f354853b0
9 changed files with 322 additions and 83 deletions

View File

@@ -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<Vo>接口的所有方法
**验收标准**: 修改后的Service类能够正确实现IEntityService<Model>和QueryService<Vo>接口的所有方法
**完成情况**: ✅ 已完成
- [ ] 选择典型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. 测试结果汇总

View File

@@ -17,21 +17,23 @@
## 2. 需求理解确认
### 2.1 原始需求
> server模块中注解了 @CacheConfig的ServiceIEntityService 的泛型改为 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<Entity>和VoableService<Entity, Vo>接口
- 需要将IEntityService<Entity>修改为IEntityService<Vo>
- 修改后Service类实现的IEntityService接口的所有方法findById, findAll, getSpecification, save, delete等的参数和返回类型都需要从Entity改为Vo
- 当前Service类同时实现IEntityService<Entity>和VoableService<Entity, Vo>接口部分还实现了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. 初步决策
基于现有项目代码分析,做出以下初步决策:

View File

@@ -26,14 +26,14 @@
对于每个注解了@CacheConfig的Service类
1. **修改接口声明**:`implements IEntityService<EntityClass>`修改为`implements IEntityService<VoClass>`
1. **修改接口声明**:
- Service类继承IEntityService接口泛型类型保持为Model实体类
- Service类继承QueryService接口泛型类型修改为Vo视图对象
2. **修改方法签名**: 同步修改所有实现的IEntityService接口方法的参数和返回类型
- findById(Integer id): 返回类型从EntityClass改为VoClass
- findAll(Specification<EntityClass> spec, Pageable pageable): 参数类型和返回类型从EntityClass改为VoClass
- getSpecification(String searchText): 返回类型从Specification<EntityClass>改为Specification<VoClass>
- save(T entity): 参数和返回类型从EntityClass改为VoClass
- delete(T entity): 参数类型从EntityClass改为VoClass
2. **修改方法签名**: 同步修改所有实现的接口方法的参数和返回类型
- findById(Integer id): 根据接口不同返回不同类型IEntityService返回ModelQueryService返回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. 任务边界限制

View File

@@ -4,10 +4,6 @@
```mermaid
flowchart TD
subgraph 客户端层
Client[客户端应用]
end
subgraph 控制器层
Controller[Controller控制器]
end
@@ -22,6 +18,15 @@ flowchart TD
实现IEntityService<Vo>]
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<Vo>
IEntityService[IEntityService<Model>
定义CRUD操作接口] --> VoableService[VoableService<M, Vo>
定义VO更新方法]
QueryService[QueryService<Vo>
定义查询操作接口]
end
subgraph 服务实现
ServiceImpl[Service实现类
实现IEntityService<Vo>和VoableService]
实现IEntityService<Model>、QueryService<Vo>和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<Vo>接口
### 4.1 IEntityService<Model>接口
```java
public interface IEntityService<Vo> {
// 根据ID查询VO对象
Vo findById(Integer id);
public interface IEntityService<Model> {
// 根据ID查询Model对象
Model findById(Integer id);
// 根据查询规范和分页参数查询VO对象列表
Page<Vo> findAll(Specification<Vo> spec, Pageable pageable);
// 根据查询规范和分页参数查询Model对象列表
Page<Model> findAll(Specification<Model> spec, Pageable pageable);
// 根据搜索文本构建查询规范
Specification<Vo> getSpecification(String searchText);
Specification<Model> getSpecification(String searchText);
// 搜索VO对象列表(默认方法)
default List<Vo> search(String searchText) {
// 搜索Model对象列表(默认方法)
default List<Model> 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<Vo>接口
```java
public interface QueryService<Vo> {
// 根据查询参数和分页条件获取Vo对象列表
Page<Vo> findAll(JsonNode paramsNode, Pageable pageable);
// 计数方法
default long count(JsonNode paramsNode) {
return 0;
}
}
```
@@ -191,11 +246,9 @@ public interface IEntityService<Vo> {
```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接口泛型的修改任务确保修改后的系统能够正确、高效地运行。

View File

@@ -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文档** (<mcfile name="CONSENSUS_接口泛型修改.md" path="d:\idea-workspace\Contract-Manager\docs\task\CONSENSUS_接口泛型修改.md"></mcfile>)
- 明确了需求描述和验收标准
- 提供了详细的技术实现方案
- 定义了技术约束和集成方案
- 添加了WebSocket服务兼容性的技术约束确保修改后的IEntityService接口与WebSocketServerCallbackManager类兼容
- 补充了WebSocket服务适配的集成方案包括测试createNewEntity等方法对VO类的处理及验证任务处理逻辑
3. **DESIGN文档** (<mcfile name="DESIGN_接口泛型修改.md" path="d:\idea-workspace\Contract-Manager\docs\task\DESIGN_接口泛型修改.md"></mcfile>)
- 绘制了整体架构图和模块依赖关系图
- 详细设计了分层结构和核心组件
- 定义了接口契约和数据流向
- 提出了异常处理策略和设计原则
- 绘制了整体架构图和模块依赖关系图添加了WebSocket服务层组件WebSocketServerHandler、WebSocketTaskManager、WebSocketCallbackManager及与服务层的交互关系
- 详细设计了分层结构和核心组件新增WebSocket服务层详细说明职责、核心组件及对接口泛型修改的影响
- 定义了接口契约和数据流向添加了WebSocket请求处理流程子图
- 提出了异常处理策略和设计原则新增WebSocket服务异常处理和相关设计原则
4. **TASK文档** (<mcfile name="TASK_接口泛型修改.md" path="d:\idea-workspace\Contract-Manager\docs\task\TASK_接口泛型修改.md"></mcfile>)
- 将任务拆分为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<EntityClass>`修改为`implements IEntityService<VoClass>`
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代理对象序列化问题确保修改后的系统能够正确、高效、稳定地运行。
本任务已完成文档编写阶段的所有工作为后续的代码实现提供了清晰的指导。文档详细记录了需求分析、技术设计、任务拆分和验收标准包括VO替代实体缓存的扩展需求和WebSocket服务适配内容,确保了任务的可执行性和可衡量性。
WebSocket服务作为系统的重要组成部分其与IEntityService接口的交互已经被详细分析并在设计文档中得到了体现。通过在文档中添加WebSocket服务相关的内容我们确保了项目团队对这部分内容有清晰的理解为后续的代码实现阶段奠定了良好的基础。
通过遵循文档中的实施路线可以系统地完成IEntityService接口泛型的修改任务解决Hibernate代理对象序列化问题并确保WebSocket服务在接口泛型修改后能够正常工作确保修改后的系统能够正确、高效、稳定地运行。

View File

@@ -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接口泛型的修改任务确保每个步骤都有明确的目标、交付物和依赖关系从而提高任务执行的效率和质量。

View File

@@ -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 测试执行和问题修复

View File

@@ -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<T> {
*/
Page<T> findAll(JsonNode paramsNode, Pageable pageable);
Specification<T> getSpecification(String searchText);
// Specification<T> getSpecification(String searchText);
Page<T> findAll(Specification<T> spec, Pageable pageable);
// Page<T> findAll(Specification<T> spec, Pageable pageable);
default long count(JsonNode paramsNode) {
return 0;

View File

@@ -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<InventoryCatalog> {
public class InventoryCatalogService implements IEntityService<InventoryCatalog>, QueryService<InventoryCatalog> {
@Lazy
@Autowired
private InventoryCatalogRepository repository;
@@ -69,6 +70,14 @@ public class InventoryCatalogService implements QueryService<InventoryCatalog> {
};
}
public List<InventoryCatalog> search(String searchText) {
Specification<InventoryCatalog> 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<InventoryCatalog> {
return repository.save(entity);
}
public List<InventoryCatalog> search(String searchText) {
Specification<InventoryCatalog> 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);
}
}