如何在 SpringMVC (5.x) 项目中启用 ehCache (3.x)
How to enable ehCache (3.x) in SpringMVC (5.x) project
在我们的项目中,我们使用 ehcache
2.x,现在我们想迁移到 3.x,但不知何故我失败了。在 2.x 中我们有 ehcache.xml
中的配置。据我了解,使用 3.x 时我也需要更改内容。
但首先我不知道如何自己连接缓存。我有
@EnableCaching
@Configuration
public class CacheConf {
@Bean
public CacheManager cacheManager() {
final CacheManagerBuilder<org.ehcache.CacheManager> ret = CacheManagerBuilder.newCacheManagerBuilder();
ret.withCache("properties", getPropCache());
ret.withCache("propertyTypes", getPropCache());
return (CacheManager) ret.build(true);
}
....
但是这个配置我得到一个 java.lang.ClassCastException: org.ehcache.core.EhcacheManager cannot be cast to org.springframework.cache.CacheManager
这意味着我无法正确设置 ehcache
。
注意:在 2.x 中,我们配置了不同类型的缓存,或多或少是由于过期时间 - 因为其他对象类型存储在其中。
获得它的提示 运行,因为我没有找到 Spring 5 和 ehcache
3.x 的工作示例?最好是没有 xml!
的配置
Ehcache CacheManager
不是 Spring CacheManager
。这就是为什么你得到 ClassCastException
.
Ehcache 3 符合 JSR107 (JCache)。所以 Spring 将使用它连接到它。
你会找到一个例子here and a simpler one in Spring Boot petclinic。
如果我以你为例,你会做类似的事情
@EnableCaching
@Configuration
public class CacheConf {
@Bean
public CacheManager cacheManager() {
EhcacheCachingProvider provider = (EhcacheCachingProvider) Caching.getCachingProvider();
Map<String, CacheConfiguration<?, ?>> caches = new HashMap<>();
caches.put("properties", getPropCache());
caches.put("propertyTypes", getPropCache());
DefaultConfiguration configuration = new DefaultConfiguration(caches, provider.getDefaultClassLoader());
return new JCacheCacheManager(provider.getCacheManager(provider.getDefaultURI(), configuration));
}
private CacheConfiguration<?, ?> getPropCache() {
// access to the heap() could be done directly cause this returns what is required!
final ResourcePoolsBuilder res = ResourcePoolsBuilder.heap(1000);
// Spring does not allow anything else than Objects...
final CacheConfigurationBuilder<Object, Object> newCacheConfigurationBuilder = CacheConfigurationBuilder
.newCacheConfigurationBuilder(Object.class, Object.class, res);
return newCacheConfigurationBuilder.build();
}
}
在我们的项目中,我们使用 ehcache
2.x,现在我们想迁移到 3.x,但不知何故我失败了。在 2.x 中我们有 ehcache.xml
中的配置。据我了解,使用 3.x 时我也需要更改内容。
但首先我不知道如何自己连接缓存。我有
@EnableCaching
@Configuration
public class CacheConf {
@Bean
public CacheManager cacheManager() {
final CacheManagerBuilder<org.ehcache.CacheManager> ret = CacheManagerBuilder.newCacheManagerBuilder();
ret.withCache("properties", getPropCache());
ret.withCache("propertyTypes", getPropCache());
return (CacheManager) ret.build(true);
}
....
但是这个配置我得到一个 java.lang.ClassCastException: org.ehcache.core.EhcacheManager cannot be cast to org.springframework.cache.CacheManager
这意味着我无法正确设置 ehcache
。
注意:在 2.x 中,我们配置了不同类型的缓存,或多或少是由于过期时间 - 因为其他对象类型存储在其中。
获得它的提示 运行,因为我没有找到 Spring 5 和 ehcache
3.x 的工作示例?最好是没有 xml!
Ehcache CacheManager
不是 Spring CacheManager
。这就是为什么你得到 ClassCastException
.
Ehcache 3 符合 JSR107 (JCache)。所以 Spring 将使用它连接到它。
你会找到一个例子here and a simpler one in Spring Boot petclinic。
如果我以你为例,你会做类似的事情
@EnableCaching
@Configuration
public class CacheConf {
@Bean
public CacheManager cacheManager() {
EhcacheCachingProvider provider = (EhcacheCachingProvider) Caching.getCachingProvider();
Map<String, CacheConfiguration<?, ?>> caches = new HashMap<>();
caches.put("properties", getPropCache());
caches.put("propertyTypes", getPropCache());
DefaultConfiguration configuration = new DefaultConfiguration(caches, provider.getDefaultClassLoader());
return new JCacheCacheManager(provider.getCacheManager(provider.getDefaultURI(), configuration));
}
private CacheConfiguration<?, ?> getPropCache() {
// access to the heap() could be done directly cause this returns what is required!
final ResourcePoolsBuilder res = ResourcePoolsBuilder.heap(1000);
// Spring does not allow anything else than Objects...
final CacheConfigurationBuilder<Object, Object> newCacheConfigurationBuilder = CacheConfigurationBuilder
.newCacheConfigurationBuilder(Object.class, Object.class, res);
return newCacheConfigurationBuilder.build();
}
}