我正在尝试使用两个Caffeine CacheManager,一个默认名称,一个命名为(“ new.kid”)。 命名的名称用于类NewKid中的特定方法,并由方法上的@Cacheable(cacheManager =“ new.kid”)指定(不能更改注释设置以解决此问题)。
我已经定义了一个自定义CacheResolver,重写了getCacheNames,以便它为类型为NewKid的目标返回new.kid缓存管理器缓存名称,否则返回defautl缓存名称。
实际上没有很多信息,但是从我收集的信息来看,如果一个具有多个(默认)CacheManager,则必须使用自定义CacheResolver。 我定义了一个自定义CacheResolver,重写了getCacheNames,以便它为类型为NewKid的目标返回new.kid缓存管理器缓存名称,否则返回默认的缓存管理器名称。 完整示例(从Spring Caching入门指南复制和修改)可以在我的github https://github.com/tyonchev/spring-cache
中找到。NaN
@Component
public class NewKid {
@Cacheable(cacheManager="new.kid")
public String whatsYourName(String input){
return "New Kid Name " + input;
}
}
@Configuration
public class NewKidCacheManager {
@Bean("new.kid")
public CacheManager newKidCacheManager() {
CacheManager cmgr = new CaffeineCacheManager();
((CaffeineCacheManager) cmgr).setCacheNames(Arrays.asList(cacheName));
((CaffeineCacheManager) cmgr).setCaffeine(Caffeine.newBuilder());
return cmgr;
}
}
@Configuration
@EnableCaching
public class CacheManagerConfig extends CachingConfigurerSupport {
@Autowired
@Qualifier(value = "new.kid")
CacheManager newKidCacheManager;
@Bean
@Override
public CacheManager cacheManager() {
...
}
@Bean
@Primary
@Override
public CacheResolver cacheResolver( ) {
return new CustomResolver(newKidCacheManager);
}
如果我使用@EnableCaching批注,那么我将停留在SimpleCacheResolver上,尽管使用@Primary @Bean批注,但它会完全忽略我的CustomResolver。 这将导致此异常:
class CustomResolver extends AbstractCacheResolver {
public CustomResolver(CacheManager newKidCacheManager) {
this.newKidCacheManager = newKidCacheManager;
}
@Override
protected Collection<String> getCacheNames(CacheOperationInvocationContext<?> cacheOperationInvocationContext) {
if (cacheOperationInvocationContext.getTarget() instanceof NewKid) {
return newKidCacheManager.getCacheNames();
} else {
return getCacheManager().getCacheNames();
}
}
}
如果我删除@EnableCaching,则会加载正确的CustomResolver,但是,当然,@Cacheable完全被忽略,因此不会缓存方法结果
我做错了什么,还是不能同时使用EnableCaching和多个带有自定义解析器的CaceManager?即使我有另一个标记为@Primary的CacheResolver Bean,我也总是被SimpleCacheResolver困扰? 如果有人能指出正确的方向,我会很高兴