为什么Spring Boot/EhCache不使用指定的配置文件?

为什么Spring Boot/EhCache不使用指定的配置文件?,spring,spring-boot,ehcache,ehcache-3,ehcache-2,Spring,Spring Boot,Ehcache,Ehcache 3,Ehcache 2,我试图在Spring Boot 2应用程序中启用EhCache 3缓存,并且尽我所知我已经正确设置了它,但缓存只是…不起作用,而且我没有得到任何关于原因的信息 我在maven POM中添加了: org.springframework.boot springbootstarter缓存 org.ehcache ehcache javax.cache 缓存api 我添加了一个@EnableCaching注释。 我已经指定了配置,我正在使用bootstrap.ymlso: spring: cac

我试图在Spring Boot 2应用程序中启用EhCache 3缓存,并且尽我所知我已经正确设置了它,但缓存只是…不起作用,而且我没有得到任何关于原因的信息

我在maven POM中添加了:


org.springframework.boot
springbootstarter缓存
org.ehcache
ehcache
javax.cache
缓存api
我添加了一个
@EnableCaching
注释。 我已经指定了配置,我正在使用
bootstrap.yml
so:

spring:
  cache:
    jcache:
      config: classpath:ehcache.xml
但为了以防万一,我还将
spring.cache.jcache.config
版本放在属性文件中

我已经编写了一个基本的
src/main/resources/ehcache.xml
文件

最后,我将一个方法设置为
@Cacheable
,但当我用“找不到名为的缓存…”调用它时,它会出错

实际上,我在
ehcache.xml
中写什么都无关紧要。我可以粘贴在Lorem Ipsum文本中而不是XML中,并且没有任何错误或指示它甚至打开了文件

Spring Boot本身似乎找到了JSR 107自动配置的适当先决条件:

   JCacheCacheConfiguration matched:
      - @ConditionalOnClass found required classes 'javax.cache.Caching', 'org.springframework.cache.jcache.JCacheCacheManager' (OnClassCondition)
      - Cache org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration automatic cache type (CacheCondition)
我试着回到EhCache 2,所以我用
net.sf.EhCache
替换了
org.EhCache
,将YML切换到
EhCache
,而不是
jcache
,并删除了
javax.cache
。这会将其放入我的自动配置报告中:

   EhCacheCacheConfiguration matched:
      - @ConditionalOnClass found required classes 'net.sf.ehcache.Cache', 'org.springframework.cache.ehcache.EhCacheCacheManager' (OnClassCondition)
      - Cache org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration automatic cache type (CacheCondition)
      - ResourceCondition (EhCache) found resource 'classpath:/ehcache.xml' (EhCacheCacheConfiguration.ConfigAvailableCondition)
但我仍然没有任何可用的缓存。为什么Spring的自动配置机制会提到它找到了EhCache 2配置文件,但实际上没有配置任何东西?我是否还需要在报告中查找其他自动配置类,如GenericCache、CacheConfiguration等

我看不到任何迹象表明它试图做任何事情来启动缓存子系统,读取我的配置,做任何事情

虽然自动配置很方便,但当它不想做这件事时,它会令人沮丧地告诉我,它完全没有告诉我为什么决定让我失望,所以我真的需要一些帮助来找出如何从这件事中挑出这些细节


我错过什么了吗?我可以调试什么,在哪里可以找到它为什么会忽略我试图告诉它的XML配置?我尝试在jcache设置周围向Spring CacheProperties添加一些断点,但在连接调试器时没有遇到这些断点。

您的配置错误。您正在使用EhCache,并在JCache的
application.yml
中指定参数(另一种缓存实现),因此不会像这样工作。使用适当的配置参数或适当的缓存框架。并从依赖项中删除
缓存api
依赖项,您只需要ehcache。@M.Deinum我从文档中得到的印象是,对于ehcache 2,即net.sf.ehcache,您在春季使用了“ehcache”,但是对于ehcache 3,即org.ehcache,您在JSR107中使用了JCache,这真的完全错了吗?您可以将普通EhCache用作wll。尽管如此,为什么您使用的是
bootstrap.yml
,而不是
application.yml
?后者与SpringCloudConfig一起用于急切地为此进行配置。如果没有SpringCloud配置,则不会读取该文件(bootstrap.properties也不会读取)。因此,看起来您正在尝试使用一些不可用的东西。如果是,则可能是您的属性被从远程配置获取的值覆盖。然而,我强烈建议将它们移动到
application.yml
而不是
bootstrap.yml
,因为它们有不同的用途。SpringCloudStarter配置以及所有这些。我是否应该将属性拆分为两个文件并使用这两个文件运行,以及每个文件中会包含哪些内容?我知道Spring正在查看bootstrap.yml,因为我可以使用它打开和关闭调试。远程配置中没有任何spring属性,因此应该是安全的。我在bootstrap.yml中也有JMX和一堆执行器配置,它们似乎正在工作。@M.Deinum,好吧,我试着回到EhCache 2,正如上面所述,它甚至认为它在自动配置报告中找到了XML文件,但它仍然不会设置缓存或告诉我原因。