Spring ehCache根据bean值跳过缓存

时间:2016-01-10 19:37:12

标签: java spring ehcache

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

我有以下缓存方法:

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

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

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)")

我在此解决方案中不喜欢的是,必须更改具有缓存方法的目标类以包含我的依赖项myBean

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

2 个答案:

答案 0 :(得分:0)

我或多或少有同样的问题。

事实上,import selenium.webdriver as webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By options = Options() options.add_argument("start-maximized") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe') driver.get("https://www.youtube.com") search_box = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//input[@id='search']")) ) driver.find_element_by_xpath("//input[@id='search']").send_keys("Selenium") 注释的conditionunless道具的SpEL表达式的上下文不允许从@Cachable中检索bean。

然而,我能够使用ApplicationContext运算符通过静态方法检索应用程序上下文,然后使用它,我可以检索我的bean并调用我需要的条件。

所以在我的情况下,最终的SpEL表达式是:

T()

答案 1 :(得分:0)

尝试直接使用目标,因为它可以正常工作

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

OR

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