2013-07-14 27 views
0

我有兩個控制器方法,@Cacheable在Grails中不尊重key =?

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

@Cacheable(value="showGearListCache") 
def show(Long id) { 
} 

顯示緩存正確:它不爲任何ID執行兩次。但是,調用「編輯」不會解析該標識。所以如果我打電話給show - edit - show,show將不會執行第二次。

我認爲問題可能是密鑰是不同的,所以我嘗試添加

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

這兩種方法,並注意到緩存停止工作完全(不要介意驅逐)。所以,我檢查什麼是高速緩存注入grailsCacheManager進級,並發現它是使用了(一個例子)的關鍵:

GET:/[CONTROLLER]/show/83 

當我本來期望它剛剛被「83」。

當然,我可以每次都清除所有條目,但如果我只是使其中一條無效,那麼這似乎本質上是浪費。

回答

0

不應該將密鑰的名稱作爲cache的名稱嗎?

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

默認參數的方法被認爲是關鍵,但訪問它們會從緩存名指定。

+0

當我這樣做時,我得到: 無法在null上找到字段或屬性'id' – Denise

0

我不確定當前的grails緩存插件(v1.1.1)是否允許驅逐控制器操作緩存的特定鍵。你可以用allEntries=true驅逐。

def show(Long id) {}如果你想關鍵的id那麼你可以指定一個像@Cacheable(value="showGearListCache", key="#p0")其中p0是該方法的第一個參數。

控制器操作的默認密鑰生成器(DefaultWebKeyGenerator)使用請求類型,URI和查詢字符串的組合。所以你的密鑰將會是GET:/app/controller/show?id=83