没有参数方法的@Cacheble注释

时间:2015-10-28 05:13:46

标签: spring ehcache spelevaluationexception

我希望在没有参数的方法上使用@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>

请建议。

4 个答案:

答案 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 并手动处理它。