6

मैं ईएचसीएच के आधार पर स्प्रिंग बूट एप्लिकेशन को दूसरे स्तर के कैश के साथ कॉन्फ़िगर करने का प्रयास कर रहा हूं।ईएचसीएफ़ कॉन्फ़िगरेशन + स्प्रिंग बूट: नो कैश रेगियनफैक्टरीएवेट एक्सेप्शन

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method  failed; nested exception is org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the  hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
    at com.yes.wizard.Application.main(Application.java:30) 
    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:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache. region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath. 
    at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:83) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550) 
    ... 20 more  

यह मेरा विन्यास है:

Application.class: मैं इस अपवाद हो रही है

@EnableAutoConfiguration 
@Configuration 
@ComponentScan 
@ImportResource(value = "/ws.xml") 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 
} 

CacheConfig.class:

@Configuration 
@EnableCaching 
public class CachingConfig implements CachingConfigurer { 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     EhCacheCacheManager cacheManager = new EhCacheCacheManager(); 
     cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject()); 
     return cacheManager; 
    } 

    @Bean 
    @Override 
    public KeyGenerator keyGenerator() { 
     return new SimpleKeyGenerator(); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { 
     EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); 
     ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     ehCacheManagerFactoryBean.setCacheManagerName("messageCache"); 
     ehCacheManagerFactoryBean.setShared(true); 
     return ehCacheManagerFactoryBean; 
    } 
} 

MyEntity:

@Entity 
@XmlRootElement 
@Table(name = "my_entity") 
@Cacheable(value = true) 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
public class MyEntity { ... } 

ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache> 
    <defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" /> 
    <cache name="messageCache" maxElementsInMemory="10" eternal="true" overflowToDisk="false" /> 
</ehcache> 

यह क्या कारण है?

+0

स्प्रिंग कैशिंग और हाइबरनेट द्वितीय स्तर कैशिंग अलग-अलग चीजें हैं ... –

+0

ईएचसीएच का उपयोग हाइबरनेट के लिए दूसरे स्तर के कैश के रूप में किया जाता है, और मेरे मामले में मैं वसंत डेटा जेपीए (हाइबरनेट के साथ) का उपयोग कर रहा हूं। तो मेरा भ्रम कहां है? – etingertal

+0

जैसा कि कहा गया है कि आपके जेपीए प्रदाता के लिए एक दूसरे स्तर के कैश का उपयोग करने वाले स्प्रिंग्स एक दूसरे के साथ कुछ लेना देना नहीं है। असल में स्प्रिंग कैशिंग के लिए आपका सेटअप कुछ भी नहीं करता है या कम से कम आपके पास मौजूद त्रुटि से संबंधित नहीं है। –

उत्तर

16

त्रुटि संदेश का महत्वपूर्ण हिस्सा है:

द्वितीय-स्तरीय कैश आवेदन में प्रयोग किया जाता है, लेकिन संपत्ति hibernate.cache.region.factory_class नहीं दिया गया है; कृपया या तो अक्षम दूसरे स्तर कैश या सही क्षेत्र hibernate.cache.region.factory_class सेटिंग का उपयोग करें और सुनिश्चित करें दूसरे स्तर कैश प्रदाता (हाइबरनेट-infinispan, जैसे) classpath पर उपलब्ध है

आप में factory_class संपत्ति सेट कर सकते हैं बनाने के कारखाने की स्थापना की स्प्रिंग बूट की application.properties फ़ाइल। उदाहरण के लिए:

spring.jpa.properties.hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory 

कक्षा का नाम जिसे आप उपयोग करने की आवश्यकता है, वह आपके एएच कैश निर्भरता पर निर्भर करेगा; इस मामले में मैंने hibernate-ehcache का उपयोग किया।

+0

में बनाना भूल गया हूं, मेरे पास' '' के बजाय '' 'था, लेकिन यह नहीं था काम। अलग संपत्ति प्रारूप क्यों? क्षमा करें, यह यहां कोई सवाल नहीं है लेकिन आपको धन्यवाद, मुझे पता चला कि मेरी समस्या क्या थी (और इस सवाल से मारा गया था)। – HankCa

+1

आप किसी गुण फ़ाइल में अलग-अलग कुंजी और मानों के लिए '=' या ':' का उपयोग कर सकते हैं –

+0

हाँ, मैंने यही सोचा था। मैंने इसे फिर से कोशिश की और काम करता है। जब मैंने इसे पहले कॉपी किया था तब से मुझे एक मजाकिया चरित्र होना चाहिए था। सब ठीक है! – HankCa

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