美文网首页springkankan(good)
SpringCache常用注解及key中参数值为null的问题解

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

作者: 王月亮17 | 来源:发表于2022-09-13 07:48 被阅读0次

    常用注解及参数:

    @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的问题解

        本文链接:https://www.haomeiwen.com/subject/dwrvbrtx.html