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

Spring Boot集成Redis使用@Cacheable返回空缓存键报错如何解决?

问题根因

你当前报错的核心原因是@Cacheable注解中指定的缓存Key对应的变量不存在/为空:

  • 你的findAll方法没有任何入参,但你在注解里指定了key = "#productId",Spring EL表达式找不到名为productId的变量,返回空值触发报错
  • 你尝试的#p0是取方法第一个入参的表达式,你的方法没有入参,所以#p0同样返回空值,无法解决问题

解决方案

根据你的业务场景二选一即可:

场景1:当前findAll就是查询全量商品列表,不需要入参

直接给全量列表指定固定的缓存Key即可,注意固定字符串需要加单引号让Spring EL识别为字面量:

@Cacheable(value = "product", key = "'allProducts'")
public List<Product> findAll() {
    return productRepository.findAll();
}

场景2:你写错了方法逻辑,本应该是按商品ID查询单个商品

给方法加上productId入参即可,此时原来的key = "#productId"就能正常取值:

@Cacheable(value = "product", key = "#productId")
public Product findById(Long productId) {
    return productRepository.findById(productId).orElse(null);
}

拓展:如果有入参仍报该错的处理方案

如果你的方法确实存在对应名称的入参仍报该错误,是因为Java编译默认会抹去方法参数名,需要开启编译参数保留方法参数名:
Maven项目在pom.xml中添加编译配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <parameters>true</parameters>
            </configuration>
        </plugin>
    </plugins>
</build>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:02