Генерация уникального ключа кеша с Spring KeyGenerator не работает
У меня проблема, когда мои ключи кеша сталкиваются в Spring с помощью@Cacheable
аннотаций. Например, с помощью следующих двух методов:
@Cacheable("doOneThing")
public void doOneThing(String name) {
// do something with name
}
@Cacheable("doAnotherThing")
public void doAnotherThing(String name) {
// do some other thing with name
}
Вот моя конфигурация кеша, в которую я добавилkeyGenerator
иcacheManager
боб:
@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();
}
};
}
}
По какой-то причине ключ кеша всегда устанавливается наname
параметр в методе, а не результатkeyGenerator.generate(..)
метод, в результате чего оба метода возвращают один и тот же результат кэширования.
Я знаю, что могу указать ключ вручную на каждом@Cacheable
аннотации, но это кажется немного обширным для каждого метода, который я хотел бы кэшировать.
Я заметил, что установкаkeyGenerator
вариант внутри@Cacheable
аннотация к имени моего компонента решает проблему следующим образом:
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
// do something with name
}
И настройкаkeyGenerator
вариант в@CacheConfig
аннотация на класс также решает проблему. Кажется, что это не должно быть необходимым, хотя. Я что-то пропустил?