返回 Bug 清单
BUG-0330project-47高已修复backend-logic
给返回 Page<T> 的方法加 @Cacheable —— 第二次命中直接 ClassCastException
发现:2026-10-01验证:2026-10-27置信度:95%
症状
商品分页接口首次请求正常,第二次开始抛 ClassCastException——反序列化缓存值得到 LinkedHashMap,无法 cast 回 PageImpl。
根因
@Cacheable 用 JSON 序列化存值时,Jackson 反序列化缺少泛型类型信息,Page<T> 被还原成 LinkedHashMap。Spring Data 的 PageImpl 也没有默认的反序列化构造配合,类型信息在『存→取』一圈后丢失。
修复方案
按优先级任选:
1) 直接移除分页方法上的 @Cacheable(分页结果命中率本来就低、key 组合爆炸,最简单可靠);
2) 必须缓存时改缓存 DTO 的 Page 子集(content+total+size+number 自定义类),并配 GenericJackson2JsonRedisSerializer 保留类型信息;
3) 自定义 PageImpl 的 Jackson 反序列化器。
判据:同一 key 连续请求两次不报错、类型完整。
检测命令
连续 curl 同一接口两次;第二次抛 CCE 即命中修复命令
grep -rn '@Cacheable' --include='*.java' | grep -iE 'page|Page<' # 排查同类地雷错误签名
Spring Cache 命中后 Page<DTO> 强转失败 ClassCastException: LinkedHashMap cannot be cast to PageImpl;且仅第二次及以后请求报错技术信息
来源项目
project-47
涉及文件
ProductService.java
标签
spring-cache, jackson, classcastexception, pagination