CacheEvict 条件注释 - Spring 缓存

CacheEvict on conditional annotation - Spring Caching

我有一个奇怪的情况,我的@CacheEvict 不工作。代码如下所示:

@Caching(evict = {
        @CacheEvict(value = CacheConsts.C_CACHE1, keyGenerator = CacheConsts.KG_CACHE1, condition="#someModel != null && #someModel.getSomeProperty() != null"),
        @CacheEvict(value = CacheConsts.C_CACHE2, keyGenerator = CacheConsts.KG_CACHE2, condition="#someModel != null && #someModel.getSomeProperty() != null"),
        @CacheEvict(value = CacheConsts.C_CACHE3, keyGenerator = CacheConsts.KG_CACHE3, condition="#someModel != null && #someModel.getSomeProperty() != null")
})
public boolean addModel(ModelDTO someModel, String tenant);

但是,当我删除条件时它会起作用!!!尽管我测试的所有数据都是非空的。

例如:当我删除这个:“#someModel != null && #someModel.getSomeProperty() != null”时,它起作用了。

我正在使用不为空的 ModelDTO 进行测试,并且“someProperty”也不为空。

在我看来,条件会过去,它会逐出..但事实并非如此。

有什么想法吗?

我的拼写格式正确吗?

为什么我的缓存不会在此处逐出?

这是否与 @Caching 注释或我不知道的 CacheEvict 条件的某些行为有关?

感谢大家的帮助或想法。

AFAICT,您的 SpEL 表达式condition 似乎是正确的。

您可能想要验证您的编译器是否已将 debug 设置为 true,这是通过“名称”引用方法参数所必需的,因为编译器随后会将变量名称包含在 Java 字节码.

您也可以尝试在 SpEL 表达式 中引用方法参数,通常(用于调试目的),例如:#a0 != null && #a0.someProperty();请参阅 docs.

中的此部分

最后,我写了一个简单的Integration Test模拟你上面的UC。

测试和支持代码(全部包含在引用测试 class 中)在一定程度上相似。但是,我的代码略有不同,因为我没有使用自定义 KeyGenerator(根据 Cache),因此我不需要包含 Caching 注释(我只是使用 cacheNames),但这应该没什么影响。测试通过!

希望这会给你更多的想法。

如有必要,请随意尝试我的测试。

干杯!