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