我希望在没有参数的方法上使用@Cacheable
注释。在这种情况下,我使用@Cacheable如下
@Cacheable(value="usercache", key = "mykey")
public string sayHello(){
return "test"
}
但是,当我调用此方法时,它不会被执行,并且会出现如下所示的异常
org.springframework.expression.spel.SpelEvaluationException:EL1008E:(pos 0):在'org.springframework.cache.interceptor.CacheExpressionRootObject'类型的对象上找不到属性或字段'mykey' - 可能不公开?< / p>
请建议。
答案 0 :(得分:34)
Spring似乎不允许您为SPEL
中的缓存键提供静态文本,并且它不会默认包含密钥上方法的名称,因此,当两个使用相同cacheName
且没有密钥的方法可能使用相同的密钥缓存不同的结果时,您可能处于这种情况。
最简单的解决方法是提供方法名称作为密钥:
@Cacheable(value="usercache", key = "#root.methodName")
public string sayHello(){
return "test"
}
这会将sayHello
设为关键。
如果您确实需要静态密钥,则应在类中定义静态变量,并使用#root.target
:
public static final String MY_KEY = "mykey";
@Cacheable(value="usercache", key = "#root.target.MY_KEY")
public string sayHello(){
return "test"
}
您可以找到here您可以在密钥中使用的SPEL表达式列表。
答案 1 :(得分:10)
尝试在mykey
周围添加单引号。这是一个SPEL表达式,单引号再次成为String
。
@Cacheable(value="usercache", key = "'mykey'")
答案 2 :(得分:1)
在密钥中添加#
@Cacheable(value="usercache", key = "#mykey")
public string sayHello(){
return "test"
}
答案 3 :(得分:0)
您可以省略关键参数。然后 Spring 会将键为 SimpleKey.EMPTY 的值放入缓存中:
@Cacheable("usercache")
或者(除了使用其他解决方案中概述的 SPEL),您始终可以注入 CacheManager
并手动处理它。