3

使用安静的 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 注释访问参数属性?

4

1 回答 1

2

Phil,最简单的解决方案是将名称和版本定义为控制器操作的参数:

@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) {
}
于 2013-04-23T06:05:20.053 回答