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的问题解析的详细内容,更多关于SpringCache key参数值null的资料请关注脚本之家其它相关文章!