使用spring cache abstraction设置jcache时遇到问题。
@Configuration
@EnableCaching
public class CacheConfig {
@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return new CaffeineCachingProvider();
}
@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
Cache<String, List<Product>> productCache = cacheManager.createCache("productCache", caffeineConfiguration);
JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
return jCacheCacheManager;
}
}
我使用Caffein作为Jcache。我无法理解我做错了什么。你能解释一下如何正确地做到这一点吗?
我在第NPE
行<{1}}获得了什么
cacheManager.createCache(...)
答案 0 :(得分:3)
详细了解Caffeine
配置。其JCache
适配器使用默认规范(JCache
)设置,该设置指出条目永不过期并按值存储(从缓存中放入/检索时复制)。 (reference here)。
当缓存设置为复制实例时,您应该选择足够的Copier
来处理它。所以你可以写:
caffeineConfiguration.setCopierFactory(JavaSerializationCopier::new);
或
caffeineConfiguration.setCopierFactory(Copier::identity);
这取决于您是否希望在缓存键/值突变的情况下是安全的。
然而,推荐选项使用default settings,其中store-by-value
选项已停用且复印机是必需的:
Config config = ConfigFactory.load();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = TypesafeConfigurator.defaults(config);
caffeineConfiguration.setExpiryPolicyFactory(factoryOf(new AccessedExpiryPolicy(new Duration(
TimeUnit.MINUTES, 60))));
或者,您可以通过以下方式禁用store-by-value
设置:
caffeineConfiguration.setStoreByValue(false);