Spring Cache:如何根据响应对象使用Cache键

时间:2012-10-25 08:01:08

标签: spring caching

我有这些方法:

@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缓存使用返回对象的属性。

2 个答案:

答案 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) {
...
}