Spring ehCache 根据一个bean值跳过缓存

Spring ehCache skip caching according to a bean value

我想知道是否可以通过某些外部条件跳过缓存,例如一个 bean 字段值。

我有以下缓存方式:

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator")
public List<CloudEntity> getTestMetaRecords(final String someParam) {
    ...
    return aRetrievedList;
}

我想要的是跳过与缓存方法无关的缓存值。 我知道 @Cacheable 注释中有 unless 参数,但我没能使它起作用。我添加了以下内容:

unless = "#myBean.getSomeValue().equals(${value.from.properties})"

非常感谢任何帮助!

更新:

好的,我发现 unlesscondition 参数都可以用于条件缓存,但它们在 spel 中使用有限的元数据集: methodName, method, target ... 我只能通过 root.target 表达式引用被调用的对象字段来做到这一点。

我的结果代码如下:

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "#root.target.myBean.getSomeValue().equals(#root.target.valueFromProperties)")

我不喜欢这个解决方案的是必须更改具有缓存方法的目标 class 以包含我的依赖项 myBean.

是否有更灵活的解决方案?

我或多或少遇到了同样的问题。

事实上,@Cachable 注解的 conditionunless 属性的 SpEL 表达式的上下文不允许从 ApplicationContext 检索 bean。

但是我能够使用 T() 运算符通过静态方法检索应用程序上下文,然后使用它,我可以检索我的 bean 并调用该条件所需的方法。

所以在我的例子中,最终的 SpEL 表达式是这样的:

condition="T(my.utils.package.Registry).getApplicationContext().getBean('myBean').cachingCondition()"

尝试直接使用 target as,它对我来说很好

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "target.myBean.getSomeValue().equals(target.valueFromProperties)")

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "target.myBean.cachingCondition()")