我一直在使用EhCache
在我的项目中实现一些缓存。我已将以下依赖项添加到我的pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.3.1</version>
</dependency>
注意EhCache
的第三个依赖关系。在我在网上找到的所有教程中,组ID是不同的。我更改组ID的原因是它已移至org.ehcache
。
我的classpath中有以下ehcache.xml文件。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true"
monitoring="autodetect"
dynamicConfig="true">
<diskStore path="java.io.tmpdir"/>
<cache name="cardTypes"
maxEntriesLocalHeap="100"
maxEntriesLocalDisk="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
<persistence strategy="localTempSwap"/>
</cache>
</ehcache>
以下是我的配置文件。
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.core.io.ClassPathResource;
@EnableCaching
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
factory.setShared(true);
return factory;
}
}
现在,我在下一行收到错误。
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
那是:
在Eclipse中: -
无法解析net.sf.ehcache.CacheManager类型。它是 间接引用所需的.class文件
在JIdea:
Error:(21, 71) java: cannot access net.sf.ehcache.CacheManager class file for net.sf.ehcache.CacheManager not found
我没有在我的项目中添加任何net.sf.ehcache内容。正如我之前提到的,ehcache
已移至org.ehcache
。
为什么我收到此错误?它与net.sf.ehcache
有关,它不是我添加的依赖项的一部分。
我应该以不同的方式编写第二个bean,因为工件已被移动了吗?或者我该如何解决这个问题呢?
答案 0 :(得分:12)
Ehcache 2位于net.sf.ehcache
包中。大多数教程都是关于它的,因为它有很长的使用寿命。 Ehcache 3,你配置的版本是新的(但当然更好)和org.ehcache
包。
移动包因为拥有自己的域更好,但也因为新版本非常不同并且能够与旧版本共存(因为某些框架使用它)。
您的错误来自EhCacheCacheManager
使用Ehcache 2的事实.Ehcache 3不需要它,因为它符合JCache。因此,您可以使用JCacheCacheManager
代替。
所以,现在,你有了Spring连接和Ehcache 2的ehcache.xml
。并且依赖于Ehcache 3.你应该调整它们来解决你的问题。
要使用Ehcache 3,最简单的方法是在application.properties
spring.cache.jcache.config=ehcache.xml
而且:
@EnableCaching
@Configuration
public class CacheConfig {
}
就是这样。
答案 1 :(得分:0)
在pom文件中添加以下依赖项:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
</dependency>