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下的所有key allEntries=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'

如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,添加博主微信哦。 请下方留言吧,可与博主自由讨论哦。

支付宝 微信
SpringCache常用注解及key中参数值为null的问题解析_第1张图片 SpringCache常用注解及key中参数值为null的问题解析_第2张图片

你可能感兴趣的:(Java)