Je veux avoir l'annotation @Cacheable
sur la méthode sans paramètre. Dans ce cas, j'utilise @Cacheable comme suit
@Cacheable(value="usercache", key = "mykey")
public string sayHello(){
return "test"
}
Cependant, lorsque j'appelle cette méthode, elle n'est pas exécutée et une exception est donnée ci-dessous.
org.springframework.expression.spel.SpelEvaluationException: EL1008E: (pos 0): la propriété ou le champ 'mykey' sont introuvables sur l'objet de type 'org.springframework.cache.interceptor.CacheExpressionRootObject' - peut-être pas public?
Veuillez suggérer.
Il semble que Spring ne vous autorise pas à fournir un texte statique pour la clé de cache dans la variable SPEL
et n'inclut pas par défaut le nom de la méthode sur la clé. Vous pourriez donc être dans une situation où deux méthodes utiliser la même cacheName
et sans clé permettrait de mettre en cache des résultats différents avec la même clé.
La solution de contournement la plus simple consiste à fournir le nom de la méthode en tant que clé:
@Cacheable(value="usercache", key = "#root.methodName")
public string sayHello(){
return "test"
}
Ceci définirait sayHello
comme clé.
Si vous avez vraiment besoin d'une clé statique, vous devez définir une variable statique dans la classe et utiliser #root.target
:
public static final String MY_KEY = "mykey";
@Cacheable(value="usercache", key = "#root.target.MY_KEY")
public string sayHello(){
return "test"
}
Vous pouvez trouver ici la liste des expressions SPEL que vous pouvez utiliser dans votre clé.
Essayez d’ajouter des guillemets simples autour de mykey
. C'est une expression SPEL, et les guillemets simples en font une variable String
.
@Cacheable(value="usercache", key = "'mykey'")
Ajouter # dans la clé
@Cacheable(value="usercache", key = "#mykey")
public string sayHello(){
return "test"
}