【问题标题】:Spring cache with instance variable and parameter as key以实例变量和参数为键的 Spring 缓存
【发布时间】:2014-02-25 15:48:59
【问题描述】:

我正在使用 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,但他们没有指定如何在密钥生成中包含方法参数。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java spring ehcache spring-cache


    【解决方案1】:

    您可以使用键中的root.target 访问A 对象。例如

    key="#root.target.b.id+'-'+#c.id"
    

    【讨论】:

    • 道歉。我想我给了spring缓存注释。在 ehcache 的 @Cacheable 注释中,我们没有“密钥”。 @Cacheable(cacheName = "homeCache", keyGenerator = .......)
    • @cfrick 太好了。我一直在寻找这个答案。但是有一点需要注意的是目标对象应该是公共的。否则你会得到类似“EL1008E:在'com.test.A'类型的对象上找不到属性或字段'B' - 可能不是公共的或不是有效吗?”
    【解决方案2】:

    我已经实现了一个自定义密钥生成器来解决这个问题。我仍然认为这可以通过 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 2015-04-17
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多