SpringCache常用注解及key中參數(shù)值為null的問(wèn)題解析

常用注解及參數(shù):

@Cacheable(參數(shù))

該注解一般加在讀方法上,將方法返回的數(shù)據(jù)加到緩存。
參數(shù):

參數(shù)名 說(shuō)明 舉例
value 存到Redis中的key的前綴 value="cache:test"
key 存到Redis中key的后半部分 key="#p0 + ':' + #p1"
unless 不緩存的數(shù)據(jù) unless="#result == null"
condition 要緩存的數(shù)據(jù),與unless相反

表中 #p0 為參數(shù),0表示第一個(gè)參數(shù),依次類推。也可以直接寫參數(shù)名。
表中 #result 為方法返回結(jié)果。

@CacheEvict(參數(shù))

該注解一般加在寫方法上,刪除緩存中對(duì)應(yīng)的key。
參數(shù):

參數(shù)名 說(shuō)明 舉例
value 要?jiǎng)h除的key的前綴 value="cache:test"
key 要?jiǎng)h除的key的后半部分 key="#p0 + ':' + #p1"
allEntries 是否刪除value下的所有key allEntries=true

@Caching(參數(shù))

用于同時(shí)添加多個(gè)緩存注解,比如:

@Caching(evict={
  @CacheEvict(...)
  @CacheEvict(...)
  ...
})

key中的值為null的問(wèn)題

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

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

然后Redis中的緩存key為:cache:test::id=null
究其原因,是因?yàn)閷?shí)現(xiàn)類的參數(shù)名不叫id。
key中參數(shù)的名字,必須與實(shí)現(xiàn)類中的參數(shù)名稱一致,才能取到值。
如果寫名字比較麻煩怕出錯(cuò),可以寫#p0,取第一個(gè)參數(shù),就跟名字脫離關(guān)系了。
另外,如果key中只有參數(shù),且這個(gè)參數(shù)又為null,那么就會(huì)報(bào)錯(cuò):

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'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容