我很清楚这个主题有很多问题,但我无法理解它。问题似乎是@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。
答案 0 :(得分:1)
我真的不明白你在这里期待什么。
您希望findAll
方法返回名为documents
的缓存的完整内容。我不认为文档中有任何内容可以让您断定此功能存在(它没有)。它也非常脆弱。如果我们正在实现它,findAll
将根据缓存的状态返回不同的结果。如果有人将此缓存配置为例如最大大小为100。或者如果缓存在启动时没有预热。
您不能指望缓存抽象(甚至缓存库)维护“对象列表”的同步视图。 findAll
的作用是返回与没有参数的键对应的条目(默认为new SimpleKey
)。