(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解决?
非常感谢。
我建议大家阅读一下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,但它们似乎不能很好地使用单音。