配置了spring-session-data-redis后无法启动spring-boot应用程序

8
在演示的Spring Boot项目中配置了spring-session-data-redis后,bootRun任务失败,并显示以下消息:
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method redisTemplate in org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration required a bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' that could not be found.
    - Bean method 'redisConnectionFactory' not loaded because @ConditionalOnClass did not find required classes 'org.apache.commons.pool2.impl.GenericObjectPool', 'redis.clients.jedis.Jedis'
    - Bean method 'redisConnectionFactory' not loaded because @ConditionalOnClass did not find required class 'io.lettuce.core.RedisClient'

Action:

Consider revisiting the entries above or defining a bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' in your configuration.

我所做的(也就是重现步骤):
1. 使用Spring Initializr创建了一个[Gradle with Java and Spring Boot 2.1.0 M1 + Web dependency]项目。
2. 按照Spring Session - Spring Boot的说明配置了Spring Session。具体来说:
- 在build.gradle的dependencies块中添加了compile 'org.springframework.session:spring-session-data-redis'
- 通过在application.properties文件中添加spring.session.store-type=redis来配置存储类型
- 配置连接属性(在application.properties文件中):spring.redis.hostspring.redis.passwordspring.redis.port,并设置相关值。
3. 在项目根目录执行./gradlew bootRun,然后收到上述错误信息。


问题:
1. 根据错误消息,我理解RedisConnectionFactory加载失败,因为它找不到Jedis或Lettuce驱动程序。难道spring-session-data-redis默认不会带一个驱动程序吗?
2. 如果我想使用Jedis驱动程序,如何解决这个问题?
3. 如果我想使用Lettuce驱动程序,如何解决这个问题?


2
  1. 不包括2或3,需要自己添加。示例使用了 spring-boot-starter-data-redis,这会默认引入一个驱动程序。
- M. Deinum
@M.Deinum 谢谢。指南本身并没有提到 spring-boot-starter-data-redis,也没有明确的驱动程序依赖关系。此外,似乎这是一种行为变化 - 我能够在不需要显式驱动程序依赖关系的情况下无缝运行使用 spring-boot 的 1.5.16.BUILD-SNAPSHOT 版本的 bootRun - Alex Lipov
2
这些指令不正确,并且与它们链接的示例应用程序不同步。它依赖于spring-boot-starter-data-redis - Andy Wilkinson
@AndyWilkinson 谢谢。有没有推荐的方式来拉取Lettuce驱动程序:通过添加spring-boot-starter-data-redis依赖隐式地拉取,还是通过添加io.lettuce:lettuce-core依赖显式地拉取? - Alex Lipov
2
我会使用启动器。 - Andy Wilkinson
2个回答

14

1.
正如@M.Deinum所提到的,spring-session-data-redis(版本2.1.0.M1)不会自动引入Jedis或Lettuce驱动程序。

2.
将最新的Jedis驱动程序添加为显式依赖项:

dependencies {  
    // ...  
    compile 'redis.clients:jedis:2.9.0'  
} 

3.
要么将spring-boot-starter-data-redis(它会引入Lettuce驱动程序),要么将最新的Lettuce驱动程序作为显式依赖项添加:


要么添加spring-boot-starter-data-redis(该依赖会自动引入Lettuce驱动程序),要么将最新版本的Lettuce驱动程序作为显式依赖项添加:

dependencies {  
    // ...  
    compile 'org.springframework.boot:spring-boot-starter-data-redis'  
    // OR
    compile 'io.lettuce:lettuce-core:5.0.5.RELEASE' 
} 

2

RedisConnectionFactory 有两种实现,都包含在 spring-session-data-redis 中:

(1) lettuce(默认)- https://github.com/spring-projects/spring-session/issues/789

(2) Jedis

由于 lettuce 和 Jedis 依赖是可选的,您必须显式声明依赖。您可以选择其中一个进行依赖声明(也可以同时使用两者,但 Spring Redis 实现器将 lettuce 作为默认实现)。

示例:

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>x.x.x</version>
    </dependency>
    <dependency>
        <groupId>io.lettuce</groupId>
        <artifactId>lettuce-core</artifactId>
        <version>x.x.x</version>
    </dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接