带着一个宁静的api调用,例如
myserver/api/mydata?req?%7Bcode%3A%2244%22%2C%20name%3A%22sally%22%2C%20version%3A7%7D
传入的参数是code = 44,name = sally和version = 7,我想仅使用名称和版本作为键来缓存响应 - 而不是代码。
我想做的是:
@Cacheable(value="myCache", key="#name.concat(#version)")
def mydata() {
.....
}
但#name和#version都解析为null。显然,该格式仅适用于方法参数,而不适用于params.name或params.version。
如果我将密钥保留为默认密钥,则缓存使用所有三个参数作为密钥(如果我更改密钥,则不使用缓存)。这将是很好的,除了我想要使用缓存,无论'代码'和基于'名称'和'版本'作为键。
我的猜测是我需要覆盖默认的KeyGenerator,但我已经尝试过但失败了。关于如何做到这一点的任何建议?
或者有没有办法使用@Cacheable注释访问params属性?
答案 0 :(得分:2)
菲尔 最简单的解决方案是将名称和版本定义为控制器操作的参数:
@Cacheable(value="myCache", key="#name.concat(#version)")
def mydata(String name, String version) {
}
如果不总是提供名称和版本参数,只需在方法签名中添加默认值:
@Cacheable(value="myCache", key="#name.concat(#version)")
def mydata(String name = null, String version = 0) {
}