2016-01-15 2 views
5

spring cache abstractionでjcacheを設定する際に問題があります。Spring Java設定で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として使用しています。私は何が間違っているのか分かりません。あなたはそれを正しく行う方法を説明しますか?私は取得しています何

はラインでNPEcacheManager.createCache(...)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caffeineCacheManager' defined in com.myapp.spring.config.CacheConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.jcache.JCacheCacheManager]: Factory method 'getSpringCacheManager' threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) 
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:677) 
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1912) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.jcache.JCacheCacheManager]: Factory method 'getSpringCacheManager' threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 34 more 
Caused by: java.lang.NullPointerException 
    at com.github.benmanes.caffeine.jcache.CacheProxy.<init>(CacheProxy.java:109) 
    at com.github.benmanes.caffeine.jcache.CacheFactory$Builder.newCacheProxy(CacheFactory.java:160) 
    at com.github.benmanes.caffeine.jcache.CacheFactory$Builder.build(CacheFactory.java:145) 
    at com.github.benmanes.caffeine.jcache.CacheFactory.createCache(CacheFactory.java:82) 
    at com.github.benmanes.caffeine.jcache.CacheManagerImpl.lambda$createCache$0(CacheManagerImpl.java:98) 
    at com.github.benmanes.caffeine.jcache.CacheManagerImpl$$Lambda$23/388708304.apply(Unknown Source) 
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853) 
    at com.github.benmanes.caffeine.jcache.CacheManagerImpl.createCache(CacheManagerImpl.java:94) 
    at com.myapp.spring.config.CacheConfig.getSpringCacheManager(CacheConfig.java:55) 
    at com.myapp.spring.config.CacheConfig$$EnhancerBySpringCGLIB$$4f46e611.CGLIB$getSpringCacheManager$1(<generated>) 
    at com.myapp.spring.config.CacheConfig$$EnhancerBySpringCGLIB$$4f46e611$$FastClassBySpringCGLIB$$b70e5f67.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:355) 
    at com.myapp.spring.config.CacheConfig$$EnhancerBySpringCGLIB$$4f46e611.getSpringCacheManager(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    ... 35 more 
+1

感謝あなたのフィードバック!次のバージョン '2.1.0'では、' CaffeineConfiguration'は 'store-by-value'を無効にし、構築時に' JavaSerializationCopier'にコピー機を設定します(store-by-valueが有効で、コピー機が明示的に設定されていない場合)。他のユーザーがこの例外に驚かないように、これは友好的な初期設定でなければなりません。 –

答えて

3

設定Caffeineについてお読みです。そのJCacheアダプタは、デフォルトの指定(JCache)の設定を使用します。この設定では、エントリは期限切れではなく、値によって格納されます(キャッシュからのput/retrieve時にコピーされます)。 (reference here)。

キャッシュがインスタンスをコピーするように設定されている場合は、それを処理する適切なCopierを選択する必要があります。だから、あなただけ書くことができます:あなたはキャッシュキー/値の変異の場合は、安全になりたい場合は

caffeineConfiguration.setCopierFactory(JavaSerializationCopier::new); 

または

caffeineConfiguration.setCopierFactory(Copier::identity); 

それが依存します。

それにも関わらず、推奨オプションはstore-by-valueオプションが無効になっているところdefault settingsを使用することで、複写機は必要です:

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); 
+0

はい、私の問題を解決しました。説明をありがとう! – marknorkin

+1

@マークJCacheは時々かなり変です。代わりに、GuavaアダプタとSpring Cacheの統合を使用すると、軽量で予測可能なシムが得られます。 Springの次のリリースにCaffeineのサポートが追加されたら、回避策を取り除くことができます。だからあなたがJCache APIを使用していない限り、私はそれを避けることをユーザーに推奨する傾向があります。 jsr107 TCKはあまり堅牢ではないので、アダプタのテストやエラーメッセージを改善することは私のやるべきことです。 –

+0

@BenManes yeap、jcache apiにバインドされています。私たちは春4.2.4を使い、4.4が来るのを待っているので、そこにカフェインのサポートがあります。とにかくヒントありがとうございました:) – marknorkin

関連する問題