@Cacheable()没有返回正确的缓存

时间:2017-09-25 15:16:57

标签: spring caching ehcache spring-cache

我很清楚这个主题有很多问题,但我无法理解它。问题似乎是@CachePut没有将新值添加到@Cacheable列表中。

调试问题后,我发现问题似乎在密钥中。

以下是代码段

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

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

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

因此,当我调用save方法时,用于缓存的密钥是递增整数,或1,2,3 ...... 但是当我尝试获取所有文档时,缓存使用SimpleKey []作为密钥。如果我尝试为@Cacheable使用相同的密钥,我会得到SpelEvaluationException,property&#39; id&#39;无法在null上找到。

所以我最后留下的是功能缓存(数据保存在缓存中),但不知怎的,我无法检索它。 底层缓存实现是EhCache。

1 个答案:

答案 0 :(得分:1)

我真的不明白你在这里期待什么。

您希望findAll方法返回名为documents的缓存的完整内容。我不认为文档中有任何内容可以让您断定此功能存在(它没有)。它也非常脆弱。如果我们正在实现它,findAll将根据缓存的状态返回不同的结果。如果有人将此缓存配置为例如最大大小为100。或者如果缓存在启动时没有预热。

您不能指望缓存抽象(甚至缓存库)维护“对象列表”的同步视图。 findAll的作用是返回与没有参数的键对应的条目(默认为new SimpleKey)。