如何解决条件注释上的 CacheEvict - Spring 缓存
我有一个奇怪的案例,我的@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,@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。
测试和支持代码(都包含在引用的测试类中)在某种程度上是相似的。但是,我的代码略有不同,因为我没有使用自定义 KeyGenerator
(每个 Cache
),因此我不需要包含 Caching
注释(我只是使用了 {{1} }),但这应该没什么影响。测试通过!
希望这会给你更多的想法。
如有必要,请随意玩弄我的测试以进行实验。
干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。