Files
contract-manager/docs/task/server模块service缓存调整为Vo对象/ALIGNMENT_server模块service缓存调整为Vo对象.md
songqq c4eec0a9dd refactor(model): 重构模型类包结构并优化序列化处理
重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。

- 将模型类按功能模块划分到ds子包中
- 为VO类添加序列化支持
- 移除冗余的serialVersionUID字段
- 修复UITools空值处理问题
- 更新项目版本号
2025-10-09 18:27:48 +08:00

6.8 KiB
Raw Permalink Blame History

6A工作流 - ALIGNMENT阶段文档

任务名称Server模块Service缓存调整为Vo对象

1. 项目上下文分析

1.1 项目结构与技术栈

  • 项目: Contract-Manager
  • 模块: server模块
  • 技术栈: Java 21, Spring Boot 3.3.7, Spring Data JPA 3.3.7, Redis (用于缓存), Lombok 1.18.32

1.2 现有代码模式

  • 接口结构: IEntityService接口定义了基础的CRUD操作泛型T当前用于指定实体类类型
  • VoableService接口: 定义了updateByVo(M model, Vo vo)方法用于将VO对象的值更新到实体对象
  • Service实现模式: 多个Service类同时实现IEntityService和VoableService接口分别指定实体类和VO类的泛型参数
  • 缓存配置: 使用@CacheConfig注解配置缓存名称方法级缓存使用@Cacheable、@CacheEvict等注解
  • 缓存问题: 当前使用实体类进行缓存由于Hibernate代理对象序列化问题可能导致懒加载异常
  • 实体类和Vo类: 都定义在 common 模块中,确保在不同模块之间的引用和使用

1.3 架构模式

  • 采用经典的三层架构Controller层、Service层、Repository层
  • Service层同时承担业务逻辑和数据转换职责
  • 使用Spring Data JPA进行数据访问
  • 使用Redis作为缓存层提高系统性能

2. 需求理解确认

2.1 原始需求

server模块中注解了 @CacheConfig的Service调整接口泛型参数涉及到Service上各个方法的修改方法修改相关引用方法的地方也要修改

2.1.1 扩展需求

使用VO替代实体缓存因为使用redis服务需要避免代理对象序列化彻底规避懒加载问题

2.2 边界确认

  • 目标范围: server模块中所有注解了@CacheConfig的Service类

  • 修改内容:

    • Service类继承IEntityService接口泛型类型保持为Model实体类
    • Service类继承QueryService接口泛型类型修改为Vo视图对象
    • Service类继承VoableService接口泛型类型保持为Model实体类和Vo视图对象
    • 实体类继承Voable接口提供toVo方法实现从实体类到VO的转换
  • 影响范围: 需要同步修改Service类中实现的接口方法的参数和返回类型

  • 任务边界: 不修改接口定义本身,只修改实现类的泛型参数和相关方法实现

2.3 需求理解

  • 当前Service类同时实现IEntityService<Entity>QueryService<Vo>接口,还需实现VoableService<Entity, Vo>接口
  • 需要调整Service类的接口实现使IEntityService保持使用实体类类型QueryService使用Vo类型
  • Service类需要同时实现IEntityService<实体类>和QueryService<Vo类>接口并根据不同接口的要求实现对应的方法IEntityService和QueryService接口有同名的方法按各自结构定义实现
  • 需要确保缓存注解的键值表达式仍然有效
  • 需要保证修改后系统功能正常运行
  • 使用VO替代实体类进行缓存避免Hibernate代理对象序列化问题彻底规避懒加载异常

3. 疑问澄清

  1. 数据转换问题: 如何处理从实体类到VO的转换和从VO到实体类的转换

    • 实体类应该实现Voable接口提供toVo方法实现从实体类到VO的转换
    • Service类实现VoableService接口提供updateByVo方法实现从Vo到实体类的转换参考ProjectQuotationService的updateByVo方法
  2. 缓存键表达式: 修改泛型后,缓存注解中的键表达式(如@CacheEvict(key = "#p0.id"))是否需要修改?

    • 需要确认VO类是否与实体类具有相同的属性结构
  3. 依赖影响: 修改Service泛型后对调用这些Service的其他组件如Controller、其他Service会有什么影响

    • 需要评估依赖影响范围并考虑如何处理
  4. 事务处理: 修改后事务处理是否会受到影响?

    • 需要确保事务边界正确维护
  5. 查询规范: getSpecification方法如何适配从Entity到Vo的转换

    • 解决方案Service类同时实现IEntityService<实体类>和QueryService<Vo类>接口
    • 在IEntityService<实体类>接口中保持getSpecification方法返回基于JPA实体的Specification
    • 在QueryService<Vo类>接口的findAll方法中先使用基于实体类的Specification查询数据然后通过map操作将实体转换为Vo
    • 实体类实现Voable<Vo类>接口提供toVo方法进行转换
  6. 缓存对象转换: 如何确保缓存中存储的是VO对象而不是实体类对象 解决方案通过以下机制确保缓存中存储VO对象

    • 服务类同时实现IEntityService<实体类>和QueryService<Vo类>接口
    • QueryService接口的方法如findById添加@Cacheable注解
    • 在这些缓存方法的实现中查询实体后通过调用实体类的toVo()方法转换为Vo对象再返回
    • 实体类实现Voable接口提供toVo()方法进行转换
  7. WebSocket服务影响: WebSocketServerCallbackManager类直接调用IEntityService接口由于我们保持IEntityService泛型为实体类因此对WebSocket服务的影响较小

    • WebSocketServerCallbackManager类中的createNewEntity、findEntityTypeInInterfaces等方法主要依赖于IEntityService的实体类泛型
    • 需要确认这些方法是否兼容当前的实现方式
  8. 任务管理影响: WebSocketServerTaskManager类中处理的任务主要依赖于IEntityService接口由于我们保持了IEntityService的泛型为实体类对任务管理的影响应该较小

4. 初步决策

基于现有项目代码分析,做出以下初步决策:

  1. 泛型修改策略: 对于每个注解了@CacheConfig的Service类同时实现IEntityService<实体类>和QueryService<Vo类>接口保持IEntityService泛型为实体类QueryService泛型为Vo类

  2. 方法适配方案:

    • IEntityService接口的方法保持基于实体类的实现
    • QueryService接口的方法如findById、findAll在内部先查询实体再通过实体类的toVo()方法转换为Vo对象返回
    • 实体类实现Voable接口提供toVo()方法进行转换
  3. 缓存键处理: QueryService接口的缓存方法如findById使用与实体类相同的ID属性作为缓存键由于Vo类通常与实体类具有相同的ID属性因此缓存注解可能不需要修改

  4. 依赖处理: 需要评估并处理所有调用修改后Service的组件确保它们适应新的接口定义

  5. 特殊方法处理: 对于getSpecification等基于JPA实体的方法保持在IEntityService接口中返回基于实体类的Specification

  6. 缓存策略: 确保所有标注@Cacheable的方法主要是QueryService接口中的方法都返回VO对象并在存储前完成从实体类到VO的转换以避免代理对象序列化问题

这些决策将在后续的共识和设计阶段进一步细化和确认。