gpt4 book ai didi

java - @Cacheable 和 @CachePut 不同的返回类型

转载 作者:行者123 更新时间:2023-12-01 16:44:06 25 4
gpt4 key购买 nike

( Will Spring's @CachePut annotation work with a void return type? )

我遇到了同样的问题

因为这个问题已经很久了,不知道有没有解决办法

创建了一个缓存:

public static final String Key = "CacheKey";

@Cacheable(cacheNames = "userCache", key = "Key")
public List<User> getAllUsers() {
...
}

使用@CachePut更新此缓存

@CachePut(cacheNames = "userCache", key = "Key")
public User addUser(User user) {
...
}

输出:

com.example.demo.dto.UserDTO cannot be cast to java.util.List

查了好几天的资料,没有找到答案

除了使用@CacheEvict(cacheNames = userCache, allEntries = true)

有没有办法使用@Cacheable和@CachePut来解决这个问题?

谢谢

最佳答案

我建议阅读 Spring Cache Abstraction 的工作原理。 https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/cache.html

基本上,缓存本质上是键值存储。对于传递给方法的相同参数,检查缓存并返回缓存的结果。如果该方法为 void,则没有任何内容可缓存。 @CachePut 需要一个“值”来与“键”配对。如果要缓存添加的用户,addUser需要返回一个User。或者让 addUser 调用另一个方法并将 @CachePut 移至该方法。

您面临的另一个问题是您的userCache来自getAllUsersList<User>并且您打算(尽管由于无效而无法工作)放置 User进入期待 List<User> 的同一个缓存

换句话说,当你 addUser ,你的userCache List 现在与 getAllUsers 结果的实际状态不同步所以你需要驱逐 userCache列表数量

改变 @CachePut(cacheNames = "userCache", key = "Key")

@CacheEvict(cacheNames = "userCache", allEntries = true )当您 addUser 时,您将清除 List 缓存,下次调用 getAllUsers 时,缓存将使用现在的结果集进行更新。

这篇文章几乎是https://stackoverflow.com/a/59361298/3625077的重复。费德里科提到这是一个常见的误解。缓存的值,不是一个可以操作的对象,即。在你的情况下,你不能 .add(user) 到 userCache 。它基本上是方法的输入/输出的快照。

关于java - @Cacheable 和 @CachePut 不同的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61810550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com