Génération de clé unique de cache avec le Printemps KeyGenerator ne fonctionne pas
Je vais avoir le problème lors de mon cache les clés sont entrés en collision au Printemps à l'aide de la @Cacheable
annotation. Par exemple, avec les deux méthodes suivantes:
@Cacheable("doOneThing")
public void doOneThing(String name) {
//do something with name
}
@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
//do some other thing with name
}
Voici ma configuration de cache, dans lequel j'ai ajouté un keyGenerator
et un cacheManager
bean:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object param : params) {
sb.append(param.toString());
}
return sb.toString();
}
};
}
}
Pour une raison quelconque, la clé de cache toujours est défini pour la name
paramètre de la méthode, et non pas le résultat de la keyGenerator.generate(..)
méthode, causant à la fois des méthodes pour renvoyer le cache même résultat.
Je sais que je peux spécifier manuellement la clé sur chaque @Cacheable
annotation, mais qui semble un peu longue pour chaque méthode, j'aimerais cache.
Modifier
J'ai remarqué que la définition de la keyGenerator
option à l'intérieur de la @Cacheable
annotation pour le nom de mon haricot résout le problème, comme suit:
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
//do something with name
}
Et le réglage de la keyGenerator
option dans le @CacheConfig
annotation sur la classe résout également le problème. Il semble que cela ne devrait pas être nécessaire. Ai-je raté quelque chose?
@Cacheable
annotation, il est interprété comme le nom de la cache à utiliser. Avez-vous vraiment vous voulez être à l'aide de deux caches?OriginalL'auteur blacktide | 2014-12-19
Vous devez vous connecter pour publier un commentaire.
Votre configuration devrait mettre en œuvre
CachingConfigurer
(généralement, il s'étendre à partir deCachingConfigurerSupport
) pour personnaliser la façon dont fonctionne la mise en cache.CachingConfigurerSupport
dans monCacheConfig
classe résolu le problème.Vous êtes les bienvenus. Il m'a fait réaliser que nous devrions probablement être un peu plus explicite à ce sujet. Je vais voir ce que je peux faire pour mettre à jour la documentation dans ce domaine. Merci pour l'élévation de cette!
StephaneNicoll puis-je vous demander pourquoi substitution de la méthode après l'extension CachingConfigurer n'est pas assez pour permettre au système de savoir ce que les instances de CacheManager et KeyGenerator il a utiliser et au lieu de cela, nous avons besoin d'annoter les méthodes de retour avec @Bean ?
Veuillez créer votre propre question
OriginalL'auteur Stephane Nicoll