SpringCache常用注解及key中参数值为null的问题解析
2024-04-10 04:00:45  阅读数 2449

常用注解及参数:

@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'