Handler修复
任务概述
修复Handler中的多个问题,包括LastData处理、try-catch块使用、ValidateException处理和灾害状态更新错误。
问题分析
1. LastData处理问题
- FertilizerHandler在事务内部手动设置LastData,违反了设计原则
- AppGameProtobufResponseListener已经统一处理LastData,Handler不应该重复处理
- Shop/BuyHandler、God/OpenHandler、Pet/GetHandler等也存在类似问题
2. try-catch块包含验证部分
- FertilizerHandler的try块包含了验证逻辑,应该将验证移到try块外
- 其他Handler如PesticideHandler、WateringHandler等已经正确实现了这个模式
3. 对ValidateException的错误处理
- 多个Handler对ValidateException进行catch,应该让ValidateException交由框架处理
- 涉及的Handler:FertilizerHandler、WeedicideHandler、WateringHandler、God/OpenHandler、Pet/GetHandler、Pet/LifeSkillUseHandler
4. 灾害状态更新错误
- GenerateDisasterListener中试图访问int类型的value属性,导致"Attempt to read property \"value\" on int"错误
- CropGrowthStageChangedEvent中oldStage和newStage是int类型,不是枚举对象
修复内容
1. FertilizerHandler修复
- 移除Handler中处理LastData的代码(第95-105行)
- 将验证逻辑移到try块外(第64-65行)
- 不catch ValidateException,只catch LogicException和Exception
- 按照PesticideHandler模式重构
2. Shop/BuyHandler修复
- 移除手动设置LastData的代码(第102-116行)
- 移除不再使用的import(DataItem、LastData)
- 购买商品会触发物品变更事件,AppGameProtobufResponseListener会自动处理LastData
3. God/OpenHandler修复
- 移除设置LastData的代码(第74-77行)
- 修复activateGodBuff方法,移除LastData处理(第191-213行)
- 移除对ValidateException的catch(第72-83行)
- 移除不再使用的import(DataGod、LastData)
4. Pet/GetHandler修复
- 移除设置LastData的代码(第69-72行)
- 移除对ValidateException的catch(第74-84行)
- 修复createPetFromItem方法,移除LastData处理(第168-203行)
5. Pet/LifeSkillUseHandler修复
- 移除对ValidateException的catch(第136-148行)
- 虽然之前重新抛出了异常,但根据任务要求应该完全不catch
6. WeedicideHandler修复
- 移除对ValidateException的catch(第75-86行)
7. WateringHandler修复
- 移除对ValidateException的catch(第75-86行)
8. GenerateDisasterListener修复
- 修复第38、39、48、49行,移除对value属性的访问
- 修复第30行的条件判断,使用枚举的value属性进行比较
- 因为CropGrowthStageChangedEvent中的oldStage和newStage是int类型,不需要访问value属性
9. CropGrowthStageChangedListener修复(关键修复)
- 修复错误的存储方式:之前直接使用Cache和LandStatusTempDto存储数据
- 改为使用LandTemp::handleLandStatusChanged()统一存储方法
- 创建LandStatusChangedEvent并通过LandTemp处理,确保存储格式一致
- 这是导致"施肥后LastData中只有物品,没有土地"问题的根本原因
10. RemoveCropHandler和CropLogic修复(铲除作物LastData问题)
- 修复CropLogic::removeCrop方法:添加土地状态变更事件触发
- 修改CropService::removeCrop返回格式:包含状态变更信息
- 修复RemoveCropHandler:在事务提交后触发土地状态变更事件
- 移除Logic层的事务管理,统一由Handler管理事务
- 这是导致"铲除作物LastData缺少土地数据"问题的根本原因
修复原则
1. LastData处理原则
- 除了User/DataHandler(强制同步)外,其他Handler都不应该处理LastData
- AppGameProtobufResponseListener统一处理LastData
- 查询类Handler(如Item/QueryHandler、Shop/QueryHandler)可以设置LastData返回查询结果
2. 验证处理原则
- 验证逻辑应该在try块外执行
- 不应该catch ValidateException,让框架处理
- 只catch LogicException和Exception进行业务逻辑和系统错误处理
3. 事务处理原则
- 验证通过后再开启事务
- 在catch块中检查事务级别并回滚
- 事务外执行不影响数据一致性的操作(如更新作物生长阶段)
测试验证
修复后的代码已提交并推送到远程仓库,需要进行以下测试:
- 施肥操作测试 - 验证LastData是否正确返回土地信息
- 购买商品测试 - 验证物品变更是否正确反映在LastData中
- 神像激活测试 - 验证神像状态变更是否正确处理
- 宠物获取测试 - 验证宠物创建是否正确处理
- 灾害生成测试 - 验证作物生长阶段变更时灾害状态更新是否正常
影响范围
- AppGame模块的所有相关Handler
- Farm模块的灾害监听器
- 前端LastData数据同步机制
提交信息
修复Handler中的问题:移除LastData处理、修复try-catch块、移除ValidateException捕获、修复灾害状态更新错误
修复土地暂存数据存储方式:使用LandTemp统一存储方法而非直接操作Cache
修复铲除作物LastData缺少土地数据问题:添加土地状态变更事件触发
完成时间
2025-05-27 11:45(包含铲除作物修复)