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
相关产品推荐
相关产品推荐

