@Caching With Multiple Keys

Ale*_*ley 5 java methods spring caching

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

@Override
public int foo(Bar bar) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

栏如下(简化):

public class Bar {
    public int id;
    public String name;
    public String baz;

    @Override
    public int hashCode() {
        //this is already being defined for something else
        ...
    }

    @Override
    public boolean equals(Object o) {
        //this is already being defined for something else
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在foo方法上使用@Cacheable; 但是,我想在id和name属性上哈希,但不是baz.有没有办法做到这一点?

vsi*_*ngh 22

您也可以使用此方法

@Override
@Cacheable(key="{#bar.name, #bar.id}")
public int foo(Bar bar) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

建议不要在多个方法参数上使用哈希码作为键 @Cacheable键

  • 但是当我使用这种方法时,它会抛出“java.lang.ClassCastException:无效的键类型,预期:org.springframework.cache.interceptor.SimpleKey,但实际上是:java.util.ArrayList”。我怎样才能克服这个问题? (2认同)

Bij*_*men 7

是的,您可以使用这些行中的Spring-EL表达式指定:

@Override
@Cacheable(key="#bar.name.concat('-').concat(#bar.id)")
public int foo(Bar bar) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

或者在bar上定义一个修改过的hashCode并调用:

@Override
@Cacheable(key="#bar.hashCodeWithIdName")
public int foo(Bar bar) {
    ....
}
Run Code Online (Sandbox Code Playgroud)