2015-10-28 79 views
7

我想在沒有參數的方法上有@Cacheable註解。在這種情況下,我使用@Cacheable如下@Cacheble無參數方法註釋

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

然而,當我調用這個方法,它沒有得到執行,並得到例外如下

org.springframework.expression.spel .SpelEvaluationException:EL1008E:(pos 0):在'org.springframework.cache.interceptor.CacheExpressionRootObject'類型的對象上找不到屬性或字段'mykey' - 可能不公開?

請建議。

回答

16

看來Spring不允許你爲SPEL中的緩存鍵提供一個靜態文本,並且它不包含默認的鍵名方法,所以你可以在當使用相同的cacheName且沒有密鑰的兩種方法可能會用相同的密鑰緩存不同的結果。

最簡單的解決方法是提供方法爲重點的名字:

@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表達式的列表。

+0

能否請您解釋一下這條線 - 靜態密鑰(的myKey你的情況),也將沒有任何意義,因爲春天已經綁定緩存的具體方法。那麼如果我沒有明確地提及它,將會存儲在緩存中的密鑰是什麼 – user3534483

+0

@ user3534483對不起,我錯了Spring使用的默認密鑰。我編輯了答案並添加了正確的信息。 – Ruben

+0

謝謝......它的工作 – user3534483

3

嘗試在mykey附近添加單引號。這是一個SPEL表達式,單引號再次使它成爲String

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

添加#在關鍵

@Cacheable(value="usercache", key = "#mykey") 
public string sayHello(){ 
    return "test" 
} 
相關問題