Spring Boot如何缓存对象列表?缓存列表方法失效求助
问题分析与解决方案
核心问题:Key表达式不匹配
你缓存列表的方法filterObjects参数是otherObjectId,但注解里写的key = "#id"——Spring无法找到名为id的参数,会导致缓存键生成异常,自然无法正确缓存。而单个对象的方法getById参数正好是id,所以能正常命中缓存。
修复步骤
修正Key表达式
将缓存列表的方法注解改为匹配参数名的写法:@Cacheable(cacheNames = "myObject", key = "#otherObjectId") public List<MyObject> filterObjects(Long otherObjectId){ //Do something }或者省略key,让Spring自动基于方法参数生成缓存键:
@Cacheable(cacheNames = "myObject") public List<MyObject> filterObjects(Long otherObjectId){ //Do something }排查同类方法调用问题
如果filterObjects是被同一个类中的其他方法直接调用,Spring的缓存AOP代理不会生效(缓存基于动态代理实现,同类调用不会触发代理逻辑)。解决办法:- 将调用逻辑迁移到其他Bean中
- 自注入当前Service实例,通过注入的对象调用
filterObjects - 开启
@EnableAspectJAutoProxy(exposeProxy = true),使用AopContext.currentProxy()获取代理对象后调用方法
确认缓存支持列表存储
检查你的缓存配置(如Redis、Caffeine等):- 若使用Redis,需确保
MyObject实现Serializable接口,避免序列化失败 - 默认的ConcurrentMapCache天然支持存储列表类型,无需额外配置
- 若使用Redis,需确保
验证方式
在filterObjects方法内添加日志,连续两次传入相同的otherObjectId调用方法:如果第一次执行方法体逻辑,第二次直接返回结果,说明缓存已生效。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

