当前位置: 首页 > 知识库问答 >
问题:

@cacheable()未返回正确的缓存

党宇定
2023-03-14

我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是@cacheput没有将新值添加到@cacheable列表中。

调试完问题后,我发现问题似乎出在钥匙上。

下面是代码片段

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

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

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

所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到SpelEvaluationException,属性'id'在null上找不到。

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

共有1个答案

沈华晖
2023-03-14

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

看起来您希望findall方法返回名为documents的缓存的完整内容。我不认为文档中有任何东西可以让您得出这个特性存在的结论(它并不存在)。它也很脆弱。如果我们实现了这一点,findall将根据缓存的状态返回不同的结果。例如,如果有人将此缓存配置为最大大小为100。或者缓存在启动时没有预热。

您不能期望缓存抽象(甚至缓存库)维护“对象列表”的同步视图。findall所做的是返回与没有参数的键(默认情况下new simplekey)相对应的条目。

 类似资料:
  • 我们有一个关于MySQL中返回错误整数值的函数的问题。我们已经检查了“booked_passeters”是否包含正确的值0,并且当移除该变量时,它可以正常工作,也就是说只返回整数40。但是,当我们试图从它中减去“booked_passeters”(最终仍应返回40)时,它就不起作用了。 包括下面的代码。 提前道谢!:-)

  • 我有一个测试类包含测试方法和两个服务类和。我正在为类中的方法编写JUnit测试,该类包括对类方法的调用。在我写的测试方法中 因此,当调用时,它应该返回大小为1,但不返回此列表,返回的是一个大小为0的列表。

  • 问题内容: 我有一个存储过程,它检查用户是否已经存在,无论用于电子邮件的输入是什么,它随数据库的第一行一起返回。如果我手动运行select语句,我将得到正确的结果。有什么建议吗? 问题答案: 您的问题无疑在这里: 白衣 您的参数名称与列名称相同。这 可 实际工作,但规则使它这样做可能是怪异。(我认为,如果您更改引号,它可能会起作用)。 但是实际上,您应该做的是将参数重命名为其他名称:

  • 我正在学习Spring WebFlux,在编写示例应用程序的过程中,我发现了一个与Spring Cache结合的反应类型(Mono/Flux)相关的问题。 考虑以下代码段(Kotlin格式): 下面的代码用于SimpleCacheResolver,但默认情况下,由于Mono不可序列化,在Redis中失败。为了使它们工作,例如,需要使用Kryo串行化器。