Erzeugen eines eindeutigen Cache-Schlüssels mit Spring KeyGenerator funktioniert nicht

Ich habe das Problem, dass meine Cache-Schlüssel im Frühjahr mit dem @ kollidiere@Cacheable Anmerkung. Zum Beispiel mit den folgenden zwei Methoden:

@Cacheable("doOneThing")
public void doOneThing(String name) {
  // do something with name
}

@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
  // do some other thing with name
}

Hier ist meine Cache-Konfiguration, in der ich ein @ hinzugefügt hakeyGenerator und eincacheManager Bohne

@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();
      }
    };
  }
}

Aus irgendeinem Grund wird der Cache-Schlüssel immer auf das @ gesetname -Parameter in der Methode, nicht das Ergebnis deskeyGenerator.generate(..) -Methode, wodurch beide Methoden dasselbe Cache-Ergebnis zurückgeben.

Ich weiß, dass ich den Schlüssel bei jedem @ manuell angeben kan@Cacheable Anmerkung, aber das scheint für jede Methode, die ich zwischenspeichern möchte, ein wenig umfangreich zu sein.

Bearbeite

Ich habe bemerkt, dass die Einstellung derkeyGenerator Option innerhalb des@Cacheable Annotation zum Namen meiner Bohne behebt das Problem wie folgt:

@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
  // do something with name
}

Und das @ einstellkeyGenerator -Option im@CacheConfig Annotation für die Klasse behebt ebenfalls das Problem. Es scheint jedoch, dass dies nicht notwendig sein sollte. Vermisse ich etwas?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage