Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @使用多个键进行缓存_Java_Spring_Caching_Methods - Fatal编程技术网

Java @使用多个键进行缓存

Java @使用多个键进行缓存,java,spring,caching,methods,Java,Spring,Caching,Methods,我有一个接收DTO并返回一些结果的服务: @Override public int foo(Bar bar) { .... } 条形图如下(简化): 我想在foo方法上使用@Cacheable;但是,我想对id和name属性进行散列,而不是baz。有没有办法做到这一点?是的,您可以沿着以下几行指定使用Spring EL表达式: @Override @Cacheable(key="#bar.name.concat('-').concat(#bar.id)") public int foo

我有一个接收DTO并返回一些结果的服务:

@Override
public int foo(Bar bar) {
    ....
}
条形图如下(简化):


我想在foo方法上使用@Cacheable;但是,我想对id和name属性进行散列,而不是baz。有没有办法做到这一点?

是的,您可以沿着以下几行指定使用Spring EL表达式:

@Override
@Cacheable(key="#bar.name.concat('-').concat(#bar.id)")
public int foo(Bar bar) {
    ....
}
或者在bar上定义一个修改过的哈希代码并调用:

@Override
@Cacheable(key="#bar.hashCodeWithIdName")
public int foo(Bar bar) {
    ....
}

您也可以使用这种方法

@Override
@Cacheable(key="{#bar.name, #bar.id}")
public int foo(Bar bar) {
    ....
}
建议不要将hashcode用作键
由@Biju和@vsingh给出的答案都是正确的;但是,如果您试图缓存的
Bar
对象很复杂,或者
foo
方法包含大量参数,那么我想再添加一个选项,使用SpEL可能不是生成密钥的最理想解决方案

您可能想考虑<代码>密钥生成器< /> >

例如:

@Override
@Cacheable(value="barCahceKey", keyGenerator="barKeyGenerator")
public int foo(Bar bar) {
  ....
}

@Component
public class BarKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object o, Method method, Object... objects) {
      // TODO logic to generate unique key
      return "Bar_Key_Generator_With_Params_etc";
    }
}
使用这种方法,您可以完全灵活地构造密钥


对于来自同一对象的键,可以使用Object.hashCode(),因此不需要逐个指定键

@Override
@Cacheable(key="#bar.hashCode()")
public int foo(Bar bar) {
    ....
}
或者如果您有一个对象和另一个键

@Override
@Cacheable(key="{#bar.hashCode(), #anotherKey}")
public int foo(Bar bar) {
    ....
}

我认为这是一个更好的解决方案。

您可以使用Spring SimpleKey类

@Cacheable(value = "barCache", key = "new org.springframework.cache.interceptor.SimpleKey(#bar.id, #bar.name)")

这回答了你的问题吗?哈希代码是危险的,因为它们不能保证是唯一的。但是当我使用这种方法时,它抛出了
java.lang.ClassCastException:Invalid key type,应为:org.springframework.cache.interceptor.SimpleKey,但was:java.util.ArrayList
。我如何克服这一点?这对我有效,但为什么解决方案会给我
java.lang.ClassCastException:无效的键类型,应为:org.springframework.cache.interceptor.SimpleKey,但was:java.util.ArrayList
异常?但为什么它需要
key=“new org.springframework.cache.interceptor.SimpleKey(#bar.id,#bar.name)”
而不是
key=“{#bar.id,#bar.name}”
如果“-”是公共静态最终字符串数据。我该怎么办?
@Cacheable(value = "barCache", key = "new org.springframework.cache.interceptor.SimpleKey(#bar.id, #bar.name)")