web-dev-qa-db-fra.com

Annotation @Cacheble sur la méthode sans paramètre

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.

11
user3534483

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

30
Ruben

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'")
7
Cliff

Ajouter # dans la clé

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