16

DTO を受け取り、結果を返すサービスがあります。

@Override
public int foo(Bar bar) {
    ....
}

バーは次のとおりです (簡略化)。

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
        ...
    }
}

foo メソッドで @Cacheable を使用したい。ただし、id プロパティと name プロパティをハッシュしたいのですが、baz はハッシュしません。これを行う方法はありますか?

4

5 に答える 5

44

このアプローチも使用できます

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

複数のメソッド引数で @Cacheable キーをキーとしてハッシュコードを使用しないことを お勧めします

于 2014-06-12T20:19:09.177 に答える
16

はい、次の行に沿って Spring-EL 式を使用して指定できます。

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

または、変更された hashCode を bar に定義して、次のように呼び出します。

@Override
@Cacheable(key="#bar.hashCodeWithIdName")
public int foo(Bar bar) {
    ....
}
于 2012-11-14T15:51:11.210 に答える
-1

同じオブジェクトからのキーは、object.hashCode() を使用できるため、キーを 1 つずつ特定する必要はありません。

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

または、オブジェクトと別のキーがある場合

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

これはより良い解決策だと思います。

于 2019-02-28T05:32:32.573 に答える