spring 无参数方法上的@ Cachable注解

shyt4zoc  于 2023-04-19  发布在  Spring
关注(0)|答案(5)|浏览(279)

我希望在方法上有@Cacheable注解,但不带参数。

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

然而,当我调用这个方法时,它不会被执行,并且会出现如下异常
异常提示:EL 1008 E:(位置0):无法在类型为“org.springframework.cache.interceptor.CacheExpressionRootObject”的对象上找到属性或字段“mykey”-可能不是公共的?
请建议。

gev0vcfq

gev0vcfq1#

Spring似乎不允许您为SPEL中该高速缓存键提供静态文本,并且它不包括默认的key上的方法名称,因此,您可能会遇到两个使用相同cacheName且没有key的方法可能会缓存具有相同key的不同结果的情况。
最简单的解决方法是提供方法的名称作为键:

@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"
}

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

hpcdzsge

hpcdzsge2#

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

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

ryoqjall3#

你可以省略key参数。Spring会将key为SimpleKey.EMPTY的值放入该高速缓存中:

@Cacheable("usercache")

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

nqwrtyyt

nqwrtyyt4#

对我来说问题是键的语法不对

@Cacheable(value = "name", key = "#object.field1+object.field2")

右为关键项目前的需求编号:

@Cacheable(value = "name", key = "#object.field1+#object.field2")
q35jwt9p

q35jwt9p5#

在密钥中添加#

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

相关问题