java - 条件注释上的 CacheEvict - Spring Caching

标签 java spring spring-cache

我有一个奇怪的情况,我的@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 表达式条件 似乎是正确的。

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

您也可以尝试在您的 SpEL 表达式中一​​般性地引用方法参数(出于调试目的),例如:#a0 != null && #a0.someProperty();请参阅 docs 中的此部分.

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

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

希望这会给您带来更多想法。

如有必要,请随意使用我的测试进行实验。

干杯!

关于java - 条件注释上的 CacheEvict - Spring Caching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65938530/

相关文章:

java - 如何在 Spring Data Jpa 中编写接受四种参数组合的选择查询

java - 使用@Cacheable的Spring缓存在启动时不起作用@PostConstruct

java数据绑定(bind)到gui,就像在c#中一样

java - 我如何将 Android 与 Java 和一个由 Scala 制作的核心一起使用?

java - Maven 项目,选择默认的 Tomcat 上下文/路径

java - 如何将字符串中的特殊字符转换为unicode?

java - Jackson 以相反的顺序从 JSON 反序列化对象

java - 使用固定值映射 JPA 中的枚举?

java - 自定义 CacheInterceptor 被默认 Spring 的 CacheInterceptor 覆盖

java - Spring @cacheable 如何在凌晨 12 点刷新缓存?