当前位置: 首页 > 知识库问答 >
问题:

无参数方法上的@Cacheble批注

谷博艺
2023-03-14

我希望在没有参数的方法上有@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' - 也许不是公共的?

请建议。

共有3个答案

严锐
2023-03-14

您可以省略关键参数。然后,Spring将使用键SimpleKey输入值。清空缓存

@Cacheable("usercache")

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

丁宏浚
2023-03-14

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

@Cacheable(value="usercache", key = "'mykey'")
乜胜泫
2023-03-14

Spring似乎不允许为<code>SPEL</code>中的缓存键提供静态文本,并且它默认不包括键上的方法名称,因此,您可能会遇到这样的情况:两个使用相同<code>cacheName</code>且没有键的方法可能会使用同一键缓存不同的结果。

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

@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表达式列表。

 类似资料:
  • 我尝试使用类似于< code > org . spring framework . cache . annotation . cache able 的东西: 自定义注释: 方面: 服务: 我的IDE (IntelliJ)看不出< code>key = "#id"用法有什么特别之处,相比之下,< code>Cacheable的类似用法用不同于纯文本的颜色显示。我提到IDE部分只是作为一个提示,以防它

  • 问题内容: spring框架使用的方法可以传递尽可能多的参数。 我想编写一个函数,它也可以接收无限量的数据。如何调用此功能,以便我可以阅读它。或如何定义它? 非常感谢。 问题答案: 它称为varargs。 它允许方法接受任意数量的参数。它们可以在方法中作为数组访问: 这是句法糖。编译器隐藏了数组的创建,因此而不是 你写

  • 问题内容: 从spring文档中: 如何指定使用和作为密钥? 问题答案: 如果没有另外指定,当前的Spring缓存实现将所有方法参数用作缓存键。如果要使用选定的键,请参考 Arjan的答案,该答案使用SpEL列表,这是创建唯一键的最简单方法。 从Spring文档 随着Spring 4.0的发布,默认的密钥生成策略发生了变化。Spring的早期版本使用密钥生成策略,该策略对于多个密钥参数仅考虑参数的

  • 打开文件 这是我的gradle文件: 我正在得到 错误:(23,0)在类型为org的对象上找不到参数[目录'libs']的方法实现()。格雷德尔。应用程序编程接口。内部的人工制品dsl。依赖关系。DefaultDependencyHandler。打开文件

  • 我正在使用Meteor的包连接到通过SOAP消息进行通信的服务器。下面是代码(没有原始url、命名空间、方法名和参数): 当我调用没有参数的方法时,我可以得到预期的输出。但是当我用参数调用方法时,我会得到意想不到的输出。由于content属性中给出的参数没有传递,所以我添加了params属性,即使这样我也无法接收预期的输出。为了测试这个问题,我创建了一个node js应用程序,并使用模块连接到同一

  • 从spring文档中: 如何指定使用和作为键?