返回 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