我尝试在基于Sping Boot 2/Spring Framework 5的Web应用程序中使用EhCache 3.5缓存功能。
我添加了EHCache依赖项:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0</version>
</dependency>
然后在src/main/resources文件夹中创建ehcache.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<cache name="orders" maxElementsInMemory="100"
eternal="false" overflowToDisk="false"
memoryStoreEvictionPolicy="LFU" copyOnRead="true"
copyOnWrite="true" />
</ehcache>
Spring 5参考指南没有提到EHCache用法,Spring 4参考指南指出:“Ehcache 3.x完全符合JSR-107,不需要专门的支持。
所以我创建了控制器OrderController和REST端点:
@Cacheable("orders")
@GetMapping(path = "/{id}")
public Order findById(@PathVariable int id) {
return orderRepository.findById(id);
}
Sping Boot 配置:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
但是当我调用这个端点时,我得到一个异常:
找不到Builder[public org.Order org.OrderController.findById(int)]的名为“orders”的缓存caches=[orders]|关键字=''|keyGenerator=''|cacheManager=''|cacheResolver=''|条件=''|除非=''|sync='false'
然后我尝试使用Spring Framework 4中的示例:
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
但由于异常而无法编译:
无法解析类型net.sf.ehcache.CacheManager。它是从必需的.class文件间接引用的
请指示。
6条答案
按热度按时间vlurs2pr1#
这里面有很多东西。您正在使用的Ehcache 3通过JCache与Spring一起使用。
这就是为什么你需要使用
spring.cache.jcache.config=classpath:ehcache.xml
。那么,您的Ehcache配置确实是Ehcache 2配置。
EhCacheCacheManager
也是如此。对于JCache,应该使用JCacheCacheManager
。但实际上,对于ehcache.xml
,您甚至不需要它。以下是使其工作的步骤
步骤1:设置正确的依赖关系。请注意,您不需要指定任何版本,因为它们是由父pom依赖项管理提供的。javax.cache现在是1.1版本。
步骤2:在
src/main/resources
中添加ehcache.xml
文件。下面是一个例子。步骤3:需要一个带有此行的
application.properties
来查找ehcache.xml
请注意,由于JCache位于类路径中,因此Spring Cache将选择它作为该高速缓存提供程序。所以不需要指定
spring.cache.type=jcache
。第4步:像之前一样启用缓存
vmpqdwk32#
您需要强制它使用ehcache版本2
使用ehcache 3:
以下是应用程序:
下面是应用程序.yml
这里是一个带有测试计数器的服务
下面是一个测试来证明它正在使用该高速缓存:
有关工作示例,请参见here。
v8wbuo2f3#
我做了额外的研究。Sping Boot 不会选择以下配置(来自application.properties):
所以我创建了jcache.xml并放入src/main/resource文件夹:
然后我在www.example.com中更改设置application.properties为
现在Spring Caching工作正常。但是如何获取ehcache.xml仍然是个问题
4uqofj5v4#
面对同样的问题。
application.properties
中配置spring.cache.jcache.config=classpath:ehcache.xml
@EnableCaching
。@CacheResult
。@CacheResult(cacheName =“vehicles”)public VehicleDetail getVehicle(@CacheKey String vehicleId)抛出VehicleServiceException
如果有人能指出我错过了什么,那就太好了。
0yg35tkg5#
hmm..将ehcache.xml更改为,做到了这一点..
uxhixvfz6#
在POM.XML中添加以下依赖项
在www.example.com文件中添加下面一行Application.properties
添加Ehcache.xml然后在@SpringBootApplication文件中添加以下代码沿着@EnableCaching