6

Ich versuche, Spring Boot-Anwendung mit Second-Level-Cache basierend auf EHCache zu konfigurieren. Ich erhalte diese Ausnahme:EHCache-Konfiguration + Spring Boot: NoCacheRegionFactoryAvailableException

Application.class:

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  

Diese meine Konfiguration ist

@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> 

Was ist der Grund dafür?

+0

Spring-Caching und Hibernate Second-Level-Caching sind verschiedene Dinge ... –

+0

EHCache wird als Second-Level-Cache für den Winterschlaf verwendet, und in meinem Fall verwende ich Federdaten jpa (mit Ruhezustand). Wo ist meine Verwirrung? – etingertal

+0

Wie gesagt, Spring-Caching-Abstract und die Verwendung eines Second-Level-Caches für Ihren JPA-Provider haben nichts miteinander zu tun. Im Grunde tut Ihr Setup für Spring Caching nichts oder hängt zumindest nicht mit dem Fehler zusammen, den Sie haben. –

Antwort

16

Der wichtigste Teil der Fehlermeldung lautet:

Second-Level-Cache in der Anwendung verwendet wird, aber Eigenschaft hibernate.cache.region.factory_class nicht gegeben ist; bitte entweder deaktivieren Second Level Cache oder richtige Region Werk auf die hibernate.cache.region.factory_class Einstellung mit und stellen Sie sicher, dass der Second Level Cache-Provider (Hibernate-Infinispan, zum Beispiel) auf dem Classpath verfügbar ist

Sie die factory_class Eigenschaft im Frühjahr Stiefel ist festlegen application.properties Datei. Beispiel:

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

Der Klassenname, den Sie verwenden müssen, hängt von Ihrer EhCache-Abhängigkeit ab; In diesem Fall habe ich hibernate-ehcache verwendet.

+0

Ich hatte das selbe aber ein' = 'anstelle eines': 'und dies nicht Arbeit. Warum das unterschiedliche Eigenschaftsformat? Tut mir leid, das ist keine Frage für hier, aber dank dir habe ich herausgefunden, was mein Problem war (und war von dieser Frage betroffen). – HankCa

+1

Sie können entweder '=' oder ':' verwenden, um Schlüssel und Werte in einer Eigenschaftendatei zu trennen –

+0

Ja, das ist, was ich dachte. Ich habe es erneut versucht und funktioniert. Ich muss einen lustigen Charakter gehabt haben, als ich es vorher kopiert habe. Alles ist gut! – HankCa