Spring Boot中Redis缓存硬编码Key实现?GET接口缓存报错求助
解决Redis缓存无参数GET接口时的null key错误
这个错误的核心原因很明确:你在@Cacheable里用了key="#AssetCache",但Spring的SpEL表达式会把#开头的内容当作**变量(比如方法参数、Bean属性)**去解析,而你的getAssetsResponse()方法没有名为AssetCache的参数,也没有对应的上下文变量,所以Spring解析不出key的值,返回null就触发了这个报错。
反观你的POST接口,#customerId是方法的入参,Spring能直接从方法参数里拿到对应的值,所以缓存能正常工作。
快速修复方案
把硬编码的key用单引号包裹,告诉SpEL这是一个字符串常量,而不是变量:
@Cacheable(value="redis-cache", key = "'AssetCache'") public Map<String, AssetDetailBO> getAssetsResponse() throws COAssetServiceExceptions { try { log.info("---- CO_STAGE=[ Caching Service ] ---- "); return mergingBrokerageAndMutulFund(assetServiceImpl.getAssetResponse()); } catch (ServiceExceptions e) { log.info("---- CO_STAGE=[ Exception while Calling Assets Adapter For COT ] ---- " + e.getErrorMessage()); throw e; } }
补充说明
- 单引号是SpEL里定义字符串常量的标准写法,这样Spring就不会尝试去解析
AssetCache为变量,而是直接把它当作缓存的key使用。 - 如果后续你的GET方法需要添加参数,记得调整key表达式(比如
key="#paramName"),避免缓存冲突。 - 如果有多个无参数的需要缓存的方法,一定要给每个方法设置唯一的固定key,不然不同方法的缓存会互相覆盖。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

