Spring Boot 2.0无法使用Caffeine作为缓存提供程序

时间:2018-03-19 12:26:58

标签: spring spring-boot

我使用Web和缓存依赖项创建Spring Boot 2.0 Starter项目:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

然后我更新了Spring bootstrap类来测试REST服务缓存:

@SpringBootApplication
@EnableCaching
@RestController
@RequestMapping
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping
    @Cacheable("hello")
    public String hello() {
        return "1";
    }
}

并在application.properties中指定了简单的缓存提供程序:

spring.cache.type=simple

一切都按预期工作。然后我添加了Caffeine依赖项并更改了缓存类型:

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

spring.cache.type=caffeine

该应用程序无法启动异常后:

引起:java.lang.IllegalArgumentException:没有自动配置缓存管理器,请检查您的配置(缓存类型为'CAFFEINE')     在org.springframework.util.Assert.notNull(Assert.java:193)〜[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]     at org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration $ CacheManagerValidator.checkHasCacheManager(CacheAutoConfiguration.java:151)~ [spring-boot-autoconfigure-2.0.0.RELEASE.jar:2.0.0.RELEASE]

我试图在application.properties中提供缓存名称,但它没有帮助。

spring.cache.cache-names=hello

请告知。

2 个答案:

答案 0 :(得分:1)

添加以下依赖项:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>5.0.8.RELEASE</version>
</dependency>

答案 1 :(得分:0)

我也遇到了同样的情况,并且我还安装了Redis。 spring.cache.type=caffeinespring.cache.caffeine.spec一样无效。似乎它尝试使用Redis缓存提供程序,该提供程序优先于Caffeine,除非您明确禁用Redis自动配置。否则,您必须手动配置Caffeine,例如:

@Configuration
public class CaffeineCacheConfiguration {
    @Bean
    public CacheManager cacheManager() {
        CaffeineCache helloCache = new CaffeineCache("hello",
                Caffeine.newBuilder().expireAfterAccess(60, TimeUnit.SECONDS).build());
        SimpleCacheManager manager = new SimpleCacheManager();
        manager.setCaches(Collections.singletonList(helloCache));
        return manager;
    }
}