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

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

您面临的另一个问题是,来自userCachegetAllUsersList<User>,并且您打算(尽管由于无效而无法使用)将User放入期望List<User>的同一缓存中

换句话说,当您使用addUser时,List的userCache现在与getAllUsers结果的实际状态不同步,因此您需要逐出List的userCache

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


@CacheEvict(cacheNames = "userCache", allEntries = true )
当您添加用户时,您将清除列表缓存,然后在下次调用getAllUsers时,将使用当前的最新结果集更新缓存。

这篇文章几乎是https://stackoverflow.com/a/59361298/3625077的重复,其中Federico提到这是一种常见的误解。缓存值不是可以对其进行操作的对象。在您的情况下,您不能.add(user)添加到userCache。它基本上是方法的输入/输出的快照。

07-24 15:15