如何在SpringMVC(5.x)项目中启用ehCache(3.x)

时间:2018-01-09 14:53:25

标签: java spring ehcache

在我们的项目中,我们使用ehcache 2.x,现在我们想要迁移到3.x,但不知怎的,我失败了很多。在2.x中,我们在ehcache.xml中进行了配置。我读到的是,在使用3.x时我也需要更改内容。

但首先我不知道如何自己连接Cache。我有

@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的配置!

1 个答案:

答案 0 :(得分:3)

Ehcache CacheManager不是春天CacheManager。这就是你得到ClassCastException

的原因

Ehcache 3符合JSR107(JCache)。所以Spring将使用它连接到它。

您将在Spring Boot here中找到一个示例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();
  }
}