我想知道是否可以通过某些外部条件跳过缓存,例如:豆字段值。
我有以下缓存方法:
@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator")
public List<CloudEntity> getTestMetaRecords(final String someParam) {
...
return aRetrievedList;
}
我想要的是跳过与缓存方法无关的缓存值。
我知道unless
注释中有@Cacheable
参数,但我没有设法让它工作。我添加了以下内容:
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)")
我在此解决方案中不喜欢的是,必须更改具有缓存方法的目标类以包含我的依赖项myBean
。
是否有更灵活的解决方案?
答案 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")
注释的condition
或unless
道具的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()")