You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何缓存对象列表?缓存列表方法失效求助

问题分析与解决方案

核心问题:Key表达式不匹配

你缓存列表的方法filterObjects参数是otherObjectId,但注解里写的key = "#id"——Spring无法找到名为id的参数,会导致缓存键生成异常,自然无法正确缓存。而单个对象的方法getById参数正好是id,所以能正常命中缓存。

修复步骤

  1. 修正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
    }
    
  2. 排查同类方法调用问题
    如果filterObjects是被同一个类中的其他方法直接调用,Spring的缓存AOP代理不会生效(缓存基于动态代理实现,同类调用不会触发代理逻辑)。解决办法:

    • 将调用逻辑迁移到其他Bean中
    • 自注入当前Service实例,通过注入的对象调用filterObjects
    • 开启@EnableAspectJAutoProxy(exposeProxy = true),使用AopContext.currentProxy()获取代理对象后调用方法
  3. 确认缓存支持列表存储
    检查你的缓存配置(如Redis、Caffeine等):

    • 若使用Redis,需确保MyObject实现Serializable接口,避免序列化失败
    • 默认的ConcurrentMapCache天然支持存储列表类型,无需额外配置

验证方式

在filterObjects方法内添加日志,连续两次传入相同的otherObjectId调用方法:如果第一次执行方法体逻辑,第二次直接返回结果,说明缓存已生效。

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:52:18