web-dev-qa-db-ja.com

パラメータなしメソッドの@Cachebleアノテーション

食べたい@Cacheableパラメータのないメソッドの注釈。その場合、@ Cacheableを次のように使用します

@Cacheable(value="usercache", key = "mykey")
public string sayHello(){
    return "test"
}

しかし、このメソッドを呼び出すと、実行されず、以下のように例外が発生します

org.springframework.expression.spel.SpelEvaluationException:EL1008E:(pos 0):プロパティまたはフィールド 'mykey'がタイプ 'org.springframework.cache.interceptor.CacheExpressionRootObject'のオブジェクトで見つかりません-おそらくパブリックではありませんか?

提案してください。

17
user3534483

SpringはSPELのキャッシュキーに静的テキストを提供することを許可していないようで、デフォルトでキーのメソッドの名前が含まれていないため、同じcacheNameを使用し、キーなしで2つのメソッドが同じキーで異なる結果をキャッシュする可能性がある状況。

最も簡単な回避策は、キーとしてメソッドの名前を提供することです。

@Cacheable(value="usercache", key = "#root.methodName")
public string sayHello(){
return "test"
}

これにより、sayHelloがキーとして設定されます。

静的キーが本当に必要な場合は、クラスで静的変数を定義し、#root.targetを使用する必要があります。

public static final String MY_KEY = "mykey";

@Cacheable(value="usercache", key = "#root.target.MY_KEY")
public string sayHello(){
return "test"
}

キーで使用できる here SPEL式のリストを見つけることができます。

41
Ruben

mykeyを一重引用符で囲んでください。これはSPEL式であり、一重引用符は再びStringにします。

@Cacheable(value="usercache", key = "'mykey'")
18
Cliff

キーに#を追加

@Cacheable(value="usercache", key = "#mykey")
public string sayHello(){
    return "test"
}
1
Giggs