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})"
非常感谢任何帮助!
更新:
好的,我发现 unless
和 condition
参数都可以用于条件缓存,但它们在 spel 中使用有限的元数据集:
methodName, method, target
...
我只能通过 root.target
表达式引用被调用的对象字段来做到这一点。
我的结果代码如下:
@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "#root.target.myBean.getSomeValue().equals(#root.target.valueFromProperties)")
我不喜欢这个解决方案的是必须更改具有缓存方法的目标 class 以包含我的依赖项 myBean
.
是否有更灵活的解决方案?
我或多或少遇到了同样的问题。
事实上,@Cachable
注解的 condition
或 unless
属性的 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()")
我想知道是否可以通过某些外部条件跳过缓存,例如一个 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})"
非常感谢任何帮助!
更新:
好的,我发现 unless
和 condition
参数都可以用于条件缓存,但它们在 spel 中使用有限的元数据集:
methodName, method, target
...
我只能通过 root.target
表达式引用被调用的对象字段来做到这一点。
我的结果代码如下:
@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "#root.target.myBean.getSomeValue().equals(#root.target.valueFromProperties)")
我不喜欢这个解决方案的是必须更改具有缓存方法的目标 class 以包含我的依赖项 myBean
.
是否有更灵活的解决方案?
我或多或少遇到了同样的问题。
事实上,@Cachable
注解的 condition
或 unless
属性的 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()")