SpringCache常用注解及key中参数值为null的问题解析

常用注解及参数:

@Cacheable(参数)

该注解一般加在读方法上,将方法返回的数据加到缓存。
参数:

参数名说明举例
value存到Redis中的key的前缀value=“cache:test”
key存到Redis中key的后半部分key=“#p0 + ‘:’ + #p1”
unless不缓存的数据unless=“#result == null”
condition要缓存的数据,与unless相反
表中 #p0 为参数,0表示第一个参数,依次类推。也可以直接写参数名。
表中 #result 为方法返回结果。
@CacheEvict(参数)

该注解一般加在写方法上,删除缓存中对应的key。
参数:

参数名说明举例
value要删除的key的前缀value=“cache:test”
key要删除的key的后半部分key=“#p0 + ‘:’ + #p1”
allEntries是否删除value下的所有keyallEntries=true
@Caching(参数)

用于同时添加多个缓存注解,比如:

@Caching(evict={
  @CacheEvict(...)
  @CacheEvict(...)
  ...
})
key中的值为null的问题

我在接口的方法上加了@Cacheable注解,如下:

@Cacheable(value="cache:test", key="'id='+#id",unless="#result==null")
String getNameById(Integer id);

然后Redis中的缓存key为:cache:test::id=null
究其原因,是因为实现类的参数名不叫id。
key中参数的名字,必须与实现类中的参数名称一致,才能取到值。
如果写名字比较麻烦怕出错,可以写#p0,取第一个参数,就跟名字脱离关系了。
另外,如果key中只有参数,且这个参数又为null,那么就会报错:

java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public java.lang.String com.xxx.service.impl.XXXServiceImpl.singleValue(java.lang.String)] caches=[cache:test:singleValue] | key='#id' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='#result == null' | sync='false'

喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Counter-Strike大牛

创作不易,感谢鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值