2017-09-25 145 views
0

我很清楚,這個主題有很多問題,但我無法理解它。問題似乎是@CachePut不會將新值添加到@Cacheable列表中。@Cacheable()沒有返回正確的緩存

調試問題後,我發現問題似乎在關鍵。

這裏是代碼片段

@CacheConfig(cacheNames = "documents") 
interface DocumentRepository { 

@CachePut(key = "#a0.id") 
Document save(Document document); 

@Cacheable() 
List<Document> findAll(); 
} 

所以,當我調用保存方法,所使用的密鑰緩存遞增的整數,或者1,2,3 ... 但是,當我試圖讓所有文檔中,緩存都使用SimpleKey []作爲鍵。如果我嘗試爲@Cacheable使用相同的密鑰,那麼將得到SpelEvaluationException,但無法在null上找到屬性「id」。

所以我最後留下的是功能緩存(數據保存在緩存中),但不知何故,我無法檢索它。 底層緩存實現是EhCache。

回答

1

我真的不明白你在這裏期待什麼。

它看起來像你期待你的findAll方法返回名爲documents緩存的全部內容。我認爲文檔中沒有任何內容可以讓您斷定此功能存在(它不會)。它也非常脆弱。如果我們正在實現該功能,則findAll將根據緩存的狀態返回不同的結果。例如,如果有人將此緩存配置爲最大大小爲100。或者如果緩存在啓動時沒有預熱。

您不能指望緩存抽象(或甚至是緩存庫)維護「對象列表」的同步視圖。 findAll所做的是返回與沒有參數的鍵對應的條目(默認爲new SimpleKey)。