我正在尝试使用Spring Cacheable
public interface UnStandardizedValueRepository extends CrudRepository<UnStandardizedValue, Integer> {
@Cacheable(value = "rest_respond_values", unless="#result == null")
UnStandardizedValue findByValue(String value);
@Override
@CacheEvict(value = "rest_respond_values", condition="#unValue != null")
<S extends UnStandardizedValue> S save(S unValue);
}
当我做“保存”时,所有试图驱逐价值的尝试都没有奏效。如果我手动执行(获取缓存管理器和逐出)它可以工作,但不是注释方式。
UnStandardizedValue test = repository.findByValue("x 99");
Assert.assertNotNull(test);
test.setValue("y");
repository.save(test);
//cacheManager.getCache("rest_respond_values").evict("x 99"); //works!
test = null; //just for safety
test = repository.findByValue("x 99"); //gets "y"
Assert.assertNull(test); //expected null but was "y"
似乎我更改的对象与Cache中的对象相同。但是,当我“保存”它应该被驱逐,而不是由“x 99”
返回我试图改变:
@Override
@CacheEvict(value = "rest_respond_values", condition="#unValue != null")
<S extends UnStandardizedValue> S save(S unValue);
@Override
@CacheEvict(value = "rest_respond_values", key="#unValue.value", condition="#unValue != null")
<S extends UnStandardizedValue> S save(S unValue);
我甚至测试了allEntries = true,但没有运气。有什么建议吗?
UnStandardizedValue具有带有getter和setter的id(Integer)和value(String)。并且toString返回值。
所以Cacheable工作,但不是驱逐(除非手动完成)。
任何人都知道如何解决这个问题?
更新
我在UnStandardizedValue类中有equals和hashcode。
我使用与“save”完全相同的驱逐(参见下面的代码)创建了一个空方法,它可以工作(在save命令之前或之后),并且我在testEvict中使用相同的对象。
public interface UnStandardizedValueRepository extends CrudRepository<UnStandardizedValue, Integer> {
@Cacheable(value = "rest_respond_values", key = "#p0", unless="#result == null")
UnStandardizedValue findByValue(String value);
//does not evict
@Override
@CacheEvict(value = "rest_respond_values", key="#p0.value", condition="#unValue != null")
<S extends UnStandardizedValue> S save(S unValue);
//evicts
@CacheEvict(value = "rest_respond_values", key="#p0.value", condition="#unValue != null")
default void testEvict(UnStandardizedValue unValue) {
}
}
更新2: 一个真正有趣的部分是“allEntries = true”的驱逐失败
@CacheEvict(value = "rest_respond_values", condition="#unValue != null", allEntries = true)
<S extends UnStandardizedValue> S save(S unValue);
但是相同的注释适用于testEvict-method。
@CacheEvict(value = "rest_respond_values", condition="#unValue != null", allEntries = true)
default void testEvict(UnStandardizedValue unValue) {
}
所以感觉保存方法有点可疑。