Caching @可缓存不';t尊重key=in grails?

Caching @可缓存不';t尊重key=in grails?,caching,grails,Caching,Grails,我有两种控制器方法 @CacheEvict(value="showGearListCache") def edit(Long id) { } 及 正确显示缓存:它不会对任何id执行两次。但是,调用“编辑”不会取消对该id的缓存。因此,如果调用show-edit-show,show将不会执行第二次 我认为问题可能是键不同,所以我尝试添加 @Cacheable(value="showGearListCache", key="#id") @CacheEvict(value="showGearList

我有两种控制器方法

@CacheEvict(value="showGearListCache")
def edit(Long id) {
}

正确显示缓存:它不会对任何id执行两次。但是,调用“编辑”不会取消对该id的缓存。因此,如果调用show-edit-show,show将不会执行第二次

我认为问题可能是键不同,所以我尝试添加

@Cacheable(value="showGearListCache", key="#id")
@CacheEvict(value="showGearListCache", key="#id")
注意到缓存完全停止工作(无需逐出)。因此,我通过向类中注入grailsCacheManager来检查缓存中的内容,并发现它使用的键是(一个示例):

我本以为是“83”的时候


当然,我每次都可以清除所有条目,但如果我只使其中一个无效,那就显得很浪费。

键的范围不应该由
缓存
名称确定吗

@Cacheable(value="showGearListCache", key="#showGearListCache.id")
@CacheEvict(value="showGearListCache", key="#showGearListCache.id")

默认情况下,方法的参数被视为键,但访问它们将从缓存名称说明符进行。

我不确定当前的grails缓存插件(v1.1.1)是否允许收回控制器操作缓存的特定键。您可以使用
allEntries=true
退出

def show(Long id){}
中,如果希望将键作为
id
,则可以指定like
@Cacheable(value=“showGearListCache”,key=“#p0”)
其中
p0
是方法中的第一个参数


控制器操作的默认密钥生成器()使用请求类型、URI和查询字符串的组合。因此,您的密钥将类似于
GET:/app/controller/show?id=83

当我这样做时,我得到:字段或属性“id”在null上找不到
GET:/[CONTROLLER]/show/83
@Cacheable(value="showGearListCache", key="#showGearListCache.id")
@CacheEvict(value="showGearListCache", key="#showGearListCache.id")