我有这些方法:
@Cacheable(value="products")
public Product findByName(String name)
@CacheEvict(value = "products", key="#productId")
public boolean updateProduct(int productID)
产品有一个字段ID,这是关键。
现在我遇到了问题,即使用update-method后,findByName仍然可以找到旧对象。我认为,问题是,findByName在键名下而不是productId下攻击对象。在方法参数中,我没有productId。但我不知道,我怎么能告诉Spring缓存使用返回对象的属性。
答案 0 :(得分:2)
您不能使用返回对象的字段作为缓存键。只有输入参数对key="#someFieldName"
参数有效。
如果您遇到过时的对象,可能需要在产品更新后使用与findByName
方法不同的密钥类型逐出整个缓存,如下所示:
@CacheEvict(value = "products", allEntries = true)
答案 1 :(得分:0)
这是使用Spring-cache框架运行inte的相当常见的限制。我通常围绕它设计的方式,当它成为一个问题时,就是在调用中包含所需的参数,该参数应该驱逐缓存,即使它不需要。像这样:
@CacheEvict(value = "products", key="#productName")
/* productName only needed for CacheEvict... */
public boolean updateProduct(int productID, String productName) {
...
}