2016-01-15 5 views
5

मुझे 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 जेसीएच के रूप में उपयोग कर रहा हूं। मैं समझ नहीं पा रहा हूं कि मैं क्या गलत कर रहा हूं। क्या आप समझाएंगे कि इसे ठीक से कैसे किया जाए?

मैं क्या हो रही है लाइन cacheManager.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',' कैफीन कॉन्फ़िगरेशन' 'स्टोर-बाय-वैल्यू' को अक्षम कर देगा और निर्माण पर 'जावासेरियलाइजेशन कोपीयर' पर कॉपियर सेट करेगा (यदि स्टोर-बाय-वैल्यू सक्षम है और कोई कॉपियर स्पष्ट रूप से सेट नहीं है)। यह मित्रवत प्रारंभिक सेटिंग्स होनी चाहिए ताकि अन्य उपयोगकर्ता इस अपवाद से आश्चर्यचकित न हों। –

उत्तर

3

और पढ़ें के बारे में Caffeine विन्यास पर NPE है। इसका 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); 
+0

हां, मेरी समस्या हल हो गई। समझाने के लिए शुक्रिया! – marknorkin

+1

@Mark JCache कई बार बहुत अजीब है। वैकल्पिक रूप से अमरूद एडाप्टर प्लस स्प्रिंग कैश एकीकरण का उपयोग एक हल्का, अधिक अनुमानित शिम है। जब कैफीन समर्थन वसंत की अगली रिलीज में जोड़ा जाता है तो कामकाज को हटाया जा सकता है। इसलिए जब तक आप जेसीएसी एपीआई का उपयोग नहीं कर रहे हैं, तो मैं उपयोगकर्ताओं से बचने की सलाह देता हूं। जेएसआर 107 टीकेसी अत्यधिक मजबूत नहीं है, इसलिए एडाप्टर के परीक्षण और त्रुटि संदेश में सुधार करना मेरी टू-डू सूची पर है। –

+0

@ बेनमेन हाप, jcache api के लिए बाध्य है। हम वसंत 4.2.4 का उपयोग कर रहे हैं और 4.4 आने की प्रतीक्षा कर रहे हैं, इसलिए इसमें कैफीन का समर्थन होगा। वैसे भी एक संकेत के लिए धन्यवाद :) – marknorkin

संबंधित मुद्दे