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?

Si vous passez un argument unique de la @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