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

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

党宇定
2023-03-14

(Spring的@CachePut注释是否适用于void返回类型?)

我遇到了同样的问题

因为这个问题已经存在很长时间了,我不知道是否有解决办法

创建缓存:

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,allEntry=true)

有没有办法用@Cacheable和@CachePut解决?

非常感谢。

共有1个答案

孟德曜
2023-03-14

我建议大家阅读一下Spring缓存抽象的工作原理。https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/cache.html

基本上,缓存本质上是键值存储。对于传入方法的相同参数,请检查缓存并返回缓存结果。如果该方法无效,则无需缓存任何内容@CachePut需要一个“值”来与“键”配对。如果要缓存添加的用户,addUser需要返回一个用户。或者让addUser调用另一个方法并将@CachePut移动到该方法。

您面临的另一个问题是您的< code>getAllUsers is 列表中的< code>userCache

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

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

to < code > @ cache evict(cache names = " user cache ",allEntries = true )添加用户时,将清除列表缓存,下次调用getAllUsers时,将使用当前结果集更新缓存。

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

 类似资料:
  • 问题内容: 我在源代码下找到了以下文档 CachePut批注不会导致目标方法被跳过-而是总是导致该方法被调用并将其结果放入缓存中。 这是否意味着如果使用,updateCustomer方法将仅执行一次,结果将在缓存中更新。随后对updateCustomer的调用将不会执行updateCustomer,而只会更新缓存。 在的情况下,方法将在每次调用时执行,结果将在缓存中更新。 我的理解正确吗? 问题答

  • 是否可以在同一方法上使用和?

  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 我正试图使用Ehcache和Spring 3.1内置的缓存注释(@Cacheable、@CacheEvict和@CachePut)在我的应用程序中实现缓存。 我创建了一个缓存,如下所示: 我正在尝试使用@CachePut注释用新值更新此缓存,如下所示: 但是,新的“用户”没有添加到缓存中。这是因为无效返回类型吗?

  • 如果请求接受头的类型为application/JSON,我希望能够发送类似JSON列表的列表,但如果请求头的类型为application/avro,则以字节数组(avro格式)发送它。这应该针对相同的RESTendpoint,如/某物/员工。我是否可以使用相同的方法但返回类型不同,Spring Boot是否会查看accept标头并正确决定调用哪个方法? 退货类型应该是什么?这是一种没有任何类型的反

  • 请原谅稍微不完整的代码,当我遇到这个问题时,我正在重组它。其要点是,在调用中,编译器表示/*Here*/的地方,编译器强制使用类型,但是当返回时,我希望通过返回204来处理,否则我希望返回200。我怎么才能做到? 理想情况下,我可以在map调用中检查它是否是mono.empty(),但如果它是空的mono,它似乎不会输入map。想过使用optionals,但它们似乎不能很好地使用单音。