无法让Spring @CacheEvict工作

时间:2015-10-07 21:02:17

标签: java spring caching annotations

我正在尝试使用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) {

    }

所以感觉保存方法有点可疑。

0 个答案:

没有答案