Grails缓存插件:只使用三个参数中的两个的可缓存密钥

时间:2013-04-22 21:53:12

标签: grails groovy ehcache

带着一个宁静的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属性?

1 个答案:

答案 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) {
}