6

Tôi đang cố định cấu hình ứng dụng Khởi động mùa xuân với bộ nhớ cache cấp thứ hai dựa trên EHCache. tôi nhận được ngoại lệ này:Cấu hình EHCache + Khởi động mùa xuân: NoCacheRegionFactoryAvailableException

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  

Đây là cấu hình của tôi:

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> 

gì đang gây ra điều này?

+0

Bộ nhớ đệm mùa xuân và bộ nhớ đệm cấp hai Hibernate là những thứ khác nhau ... –

+0

EHCache được sử dụng làm bộ nhớ cache cấp thứ hai cho ngủ đông, và trong trường hợp của tôi, tôi đang sử dụng dữ liệu spring jpa (với hibernate). Vậy đâu là sự nhầm lẫn của tôi? – etingertal

+0

Như đã nêu lò xo bộ nhớ đệm trừu tượng và việc sử dụng một bộ nhớ cache cấp thứ hai cho nhà cung cấp JPA của bạn không có gì để làm với nhau. Về cơ bản thiết lập của bạn cho Spring Caching không làm bất cứ điều gì hoặc ít nhất là không liên quan đến lỗi bạn có. –

Trả lời

16

Các phần quan trọng của thông báo lỗi là:

Thứ hai cấp bộ nhớ cache được sử dụng trong các ứng dụng, nhưng tài sản hibernate.cache.region.factory_class không nhất định; vui lòng vô hiệu hóa bộ nhớ cache mức thứ hai hoặc thiết lập nhà máy khu vực đúng sử dụng cài đặt hibernate.cache.region.factory_class và chắc chắn rằng các nhà cung cấp bộ nhớ cache mức thứ hai (hibernate-infinispan, ví dụ) có sẵn trên classpath

Bạn có thể đặt factory_class bất động sản trong mùa xuân Boot của application.properties tệp. Ví dụ:

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

Tên lớp mà bạn cần phải sử dụng sẽ phụ thuộc vào sự phụ thuộc ehcache của bạn; trong trường hợp này tôi đã sử dụng hibernate-ehcache.

+0

Tôi đã có cùng một nhưng thay vì' = 'thay vì một': 'và điều này không công việc. Tại sao định dạng thuộc tính khác nhau? Xin lỗi đây không phải là một câu hỏi cho ở đây nhưng nhờ bạn, tôi đã phát hiện ra vấn đề của tôi là gì (và bị câu hỏi này xảy ra). – HankCa

+1

Bạn có thể sử dụng '=' hoặc ':' để tách các khóa và giá trị trong một tệp thuộc tính –

+0

Vâng đó là những gì tôi nghĩ. Tôi đã thử lại và hoạt động. Tôi phải có một nhân vật hài hước từ khi tôi sao chép nó trước đây. Tất cả đều tốt! – HankCa

Các vấn đề liên quan