java - 条件注释上的 CacheEvict - 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()
:请参阅文档中的此部分。
最后,我编写了一个简单的集成测试来模拟上面的 UC。
测试和支持代码(都包含在引用的测试类中)在某种程度上是相似的。但是,我的代码略有不同,因为我没有使用自定义KeyGenerator
(per Cache
),因此我不需要包含Caching
注释(我只是使用cacheNames
了),但这应该没什么影响。测试通过了!
希望这会给你更多的想法。
如有必要,请随意使用我的测试进行实验。
干杯!
推荐阅读
- javascript - 使用 JS 和 JSON 创建动态单选按钮列表
- elasticsearch - How to remove empty strings from elastic search array in all available documents in an index?
- arrays - 如何将数组传递给 jq 以过滤结果
- azure - 如何在 Azure 中仅创建虚拟机日志?
- javascript - 如何正确使用 Eel 将下拉值从 JavaScript 传递到 Python?
- python - 比较数据框的新版本以识别对新数据框的更改
- python-3.x - 如何在 selenium 中使用 chrome webdriver 将 python 中的文件下载到特定文件夹而不询问用户在哪里保存?
- java - 在 Spring Cloud Gateway 中更改响应 - 新对象
- python - 如何将 str 转换为漂亮的汤标签
- .htaccess - .htaccess mod_rewrite:-s 和 -f 条件的区别