2015-10-28 7 views
7

Ich möchte @Cacheable Annotation auf Methode ohne Parameter haben. In diesem Fall verwende ich @Cacheable wie folgt@Cacheble Annotation auf keine Parameter Methode

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

Allerdings, wenn ich diese Methode aufrufen, ist es nicht ausgeführt werden sollen und es Ausnahme, wie unten

org.springframework.expression.spel erhalten .SpeelEvaluationException: EL1008E: (Pos 0): Eigenschaft oder Feld 'Mykey' kann nicht auf Objekt des Typs 'org.springframework.cache.interceptor.CacheExpressionRootObject' gefunden werden - möglicherweise nicht öffentlich?

Bitte vorschlagen.

Antwort

16

Es scheint, dass Spring Ihnen nicht erlaubt, einen statischen Text für den Cache-Schlüssel in der SPEL bereitzustellen, und es enthält nicht standardmäßig den Namen der Methode für den Schlüssel, so dass Sie in einem sein könnten Situation, wenn zwei Methoden mit der gleichen cacheName und ohne einen Schlüssel möglicherweise verschiedene Ergebnisse mit dem gleichen Schlüssel cachen.

Die einfachste Abhilfe ist, den Namen der Methode als Schlüssel zur Verfügung zu stellen:

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

Diese sayHello als Schlüssel festgelegt würde.

Wenn Sie wirklich einen statischen Schlüssel benötigen, sollten Sie eine statische Variable in der Klasse definieren und verwenden #root.target:

public static final String MY_KEY = "mykey"; 

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

Sie here die Liste der SPEL Ausdrücke finden, die Sie in Ihren Schlüssel verwenden können.

+0

Können Sie bitte diese Zeile erklären . also was wäre der Schlüssel, der im Cache gespeichert wird, wenn ich es nicht explizit erwähne – user3534483

+0

@ user3534483 Sorry, ich war falsch über den Standardschlüssel, den Spring verwendet. Ich habe die Antwort bearbeitet und die richtigen Informationen hinzugefügt. – Ruben

+0

Danke ... es hat funktioniert – user3534483

3

Versuchen Sie, einzelne Anführungszeichen um mykey hinzuzufügen. Es ist ein SPEL-Ausdruck, und die Singles-Zitate machen es wieder zu einem String. Ein statischer Schlüssel (mykey in Ihrem Fall) wäre auch nicht sinnvoll, da Frühling bereits den Cache auf die spezifische Methode bindet -

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

Add # im Schlüssel

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