2

我正在使用 ehcache 来缓存方法结果。键必须是成员对象和方法参数的组合。我的课看起来像:

Class A {

private B b;

@Cacheable(value="someCache",key="some key based on B and C")
public Result getResult(C c){
......
}

我需要基于 B 和 C 的密钥。我参考了https://code.google.com/p/ehcache-spring-annotations/issues/detail?id=69但他们没有指定如何包含方法参数在密钥生成中。有人可以帮我解决这个问题吗?

4

2 回答 2

8

您可以使用密钥访问A对象root.target。例如

key="#root.target.b.id+'-'+#c.id"
于 2014-02-25T16:30:59.143 回答
0

我已经实现了一个自定义密钥生成器来解决这个问题。我仍然认为这可以通过 ehcache 解决,而无需使用自定义密钥生成器。但我无法在任何地方得到答案。请看下面我的回答:

@Component
public class Home {

    private Parameter param;

    @Cacheable(cacheName = "homeCache", 
                    keyGenerator = @KeyGenerator(name = "com.myapp.cache.Home.ParamKeyGenerator"))

    public Result getPerson(Person p) {

        //Do something with p
        return result;
    }

    public Parameter getParam() {

        return param;
    }

    public void setParam(Parameter param) {

        this.param = param;
    }

    public static class ParamKeyGenerator implements CacheKeyGenerator<Serializable> {

        public Serializable generateKey(MethodInvocation methodInvocation) {

            Object[] obj = methodInvocation.getArguments();
            Home h = (Home) methodInvocation.getThis();

            return this.generateKey(obj[0], h.getParam());
        }

        public Serializable generateKey(Object... data) {

            String key = ((Person) data[0]).getName() + ((Parameter) data[1]).getName();
            System.out.println("generating key: " + key);
            return key;
        }
    }
}
于 2014-02-26T02:28:32.037 回答