繁体   English   中英

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”,它起作用了。

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

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

有任何想法吗?

我的拼写是否正确形成?

为什么我的缓存不会在这里驱逐?

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

感谢任何帮助或想法的人。

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

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

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

最后,我编写了一个简单的集成测试来模拟上面的 UC。

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

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

随意玩我的测试以根据需要进行实验。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM