Java 在Spring KeyGenerator不工作的情况下生成唯一缓存密钥

Java 在Spring KeyGenerator不工作的情况下生成唯一缓存密钥,java,spring,caching,spring-cache,Java,Spring,Caching,Spring Cache,当我的缓存键在春季使用@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 }

当我的缓存键在春季使用
@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
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();
      }
    };
  }
}

在类上的
@CacheConfig
注释中设置
keyGenerator
选项也可以解决这个问题。但这似乎不必要。我遗漏了什么吗?

您的配置应该实现(通常您可以从
CachingConfigurerSupport
扩展)以自定义缓存的工作方式。

谢谢!在我的
CacheConfig
类中扩展
CachingConfigurerSupport
解决了这个问题。不客气。这让我意识到我们应该更明确一点。我将看看我能做些什么来更新该领域的文档。谢谢你提出这个!StephaneNicoll我可以问一下,为什么在扩展CachingConfigure后重写该方法不足以让系统知道它必须使用哪些CacheManager和KeyGenerator实例,而我们需要用@Bean注释返回它们的方法?如果您将单个参数传递给
@Cacheable
注释它被解释为要使用的缓存的名称。你真的想使用两个不同的缓存吗?
@Cacheable(value = "doOneThing", keyGenerator = "keyGenerator")
public void doOneThing(String name) {
  // do something with name
}