我最近从1.4升级到spring boot 1.5.7,发现Ehcache已从2.x升级到3.x.配置全部改变了。现在我无法设置缓存配置。
我尝试按照Ehcache官方blog上的步骤进行操作,但没有成功。
这是我的ehcache-dev.xml
<config
xmlns='http://www.ehcache.org/v3'
xmlns:jcache='http://www.ehcache.org/v3/jsr107'>
<service>
<jcache:defaults>
<jcache:cache name="categoryCache" template="catalog-cache"/>
<jcache:cache name="cfCategoryCache" template="catalog-cache"/>
<jcache:cache name="ebooks" template="other-cache"/>
<jcache:cache name="userNameToken" template="other-cache"/>
</jcache:defaults>
</service>
<cache-template name="catalog-cache">
<heap unit="entries">200</heap>
<expiry>
<ttl unit="minutes">10</ttl>
</expiry>
</cache-template>
<cache-template name="other-cache">
<!--<listeners>-->
<!--<listener>-->
<!--<class>org.terracotta.ehcache.EventLogger</class>-->
<!--<event-firing-mode>ASYNCHRONOUS</event-firing-mode>-->
<!--<event-ordering-mode>UNORDERED</event-ordering-mode>-->
<!--<events-to-fire-on>CREATED</events-to-fire-on>-->
<!--<events-to-fire-on>UPDATED</events-to-fire-on>-->
<!--<events-to-fire-on>EXPIRED</events-to-fire-on>-->
<!--<events-to-fire-on>REMOVED</events-to-fire-on>-->
<!--<events-to-fire-on>EVICTED</events-to-fire-on>-->
<!--</listener>-->
<!--</listeners>-->
<heap unit="entries">1000</heap>
<expiry>
<ttl unit="minutes">15</ttl>
</expiry>
</cache-template>
</config>
我的application-dev.properties
文件包含以下行:
spring.cache.jcache.config=classpath:ehcache-dev.xml
在dev
个人资料上运行时,会生成错误:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'jCacheCacheManager' threw exception; nested exception is javax.cache.CacheException: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 135 more
Caused by: javax.cache.CacheException: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml
at org.ehcache.jsr107.EhcacheCachingProvider$ConfigSupplier.getConfiguration(EhcacheCachingProvider.java:327)
at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:128)
at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:79)
at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.createCacheManager(JCacheCacheConfiguration.java:115)
at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.jCacheCacheManager(JCacheCacheConfiguration.java:97)
at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07.CGLIB$jCacheCacheManager$1(<generated>)
at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07$$FastClassBySpringCGLIB$$fee1b5ae.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)
at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07.jCacheCacheManager(<generated>)
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:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
... 136 more
Caused by: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml
at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:167)
at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:131)
at org.ehcache.jsr107.EhcacheCachingProvider$ConfigSupplier.getConfiguration(EhcacheCachingProvider.java:324)
... 150 more
Caused by: org.xml.sax.SAXParseException; systemId: file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml; lineNumber: 20; columnNumber: 17; cvc-complex-type.2.4.a: Invalid content was found starting with element 'expiry'. One of '{"http://www.ehcache.org/v3":heap-store-settings, "http://www.ehcache.org/v3":disk-store-settings, "http://www.ehcache.org/v3":service-configuration}' is expected.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177)
at org.ehcache.xml.ConfigurationParser.<init>(ConfigurationParser.java:165)
at org.ehcache.xml.XmlConfiguration.parseConfiguration(XmlConfiguration.java:175)
at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:163)
... 152 more
现在,如果我没有错,那么接受expiry
元素中的cache-template
元素会有问题。但情况并非如此,因为明确提到here A <cache-template> element may contain all the same child elements as a <cache> element.
和cache
元素确实有expiry
元素。
我无法理解我在这里错过了什么。任何帮助赞赏。 TIA
答案 0 :(得分:1)
显然,问题在于元素的顺序。
heap
元素必须位于expiry
元素之后。
以下配置正常:
<cache-template name="catalog-cache">
<expiry>
<ttl unit="minutes">10</ttl>
</expiry>
<heap unit="entries">200</heap>
</cache-template>
这没有任何意义,因为顺序无关紧要。已向EhCache提交bug-report
答案 1 :(得分:0)
您可以查看ehcache文档中提供的版本3(扩展名为jsr107)的XML示例,请参见link。查看您的XML格式是否遵循此处给定的标记。