无参数方法上的@Cacheble 注解

@Cacheble annotation on no parameter method

我想在没有参数的方法上添加 @Cacheable 注释。在那种情况下,我使用@Cacheable 如下

@Cacheable(value="usercache", key = "mykey")
public string sayHello(){
    return "test"
}

但是,当我调用这个方法时,它没有被执行,并且出现如下异常

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'mykey' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject' - maybe not public?

求推荐。

似乎 Spring 不允许您为 SPEL 中的缓存键提供静态文本,并且默认情况下不包括方法名称键,因此,您可能会遇到两种使用相同 cacheName 且没有键的方法可能会使用相同键缓存不同结果的情况。

最简单的解决方法是提供方法名称作为键:

@Cacheable(value="usercache", key = "#root.methodName")
public string sayHello(){
return "test"
}

这会将 sayHello 设置为密钥。

如果确实需要静态键,应该在class中定义一个静态变量,然后使用#root.target

public static final String MY_KEY = "mykey";

@Cacheable(value="usercache", key = "#root.target.MY_KEY")
public string sayHello(){
return "test"
}

您可以找到 here 您可以在密钥中使用的 SPEL 表达式列表。

尝试在 mykey 周围添加单引号。这是一个 SPEL 表达式,单引号再次使它成为 String

@Cacheable(value="usercache", key = "'mykey'")

在键中添加#

@Cacheable(value="usercache", key = "#mykey")
public string sayHello(){
    return "test"
}

key参数可以省略。 Spring 然后会将键为 SimpleKey.EMPTY 的值放入缓存中:

@Cacheable("usercache")

或者(除了使用其他解决方案中概述的 SPEL 之外)您始终可以注入 CacheManager 并手动处理它。