Après avoir configuré spring-session-data-redis
dans un projet de démo Spring-Boot, la tâche bootRun
échoue avec le message suivant:
***************************
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.
Ce que j'ai fait (alias étapes pour reproduire):
1. Utilisé Spring Initializr pour créer un projet [Gradle avec Java et Spring Boot 2.1.0 M1 + Web dependency]).
2. J'ai suivi les instructions Spring Session - Spring Boot pour configurer Spring Session. Plus précisement:
- ajoutée compile 'org.springframework.session:spring-session-data-redis'
au bloc de dépendances de build.gradle
- a configuré le type de magasin en ajoutant spring.session.store-type=redis
à application.properties
fichier
- configuré les propriétés de connexion (dans application.properties
fichier): spring.redis.Host
, spring.redis.password
et spring.redis.port
avec des valeurs pertinentes
3. Réalisé ./gradlew bootRun
de la racine du projet et a reçu l'erreur ci-dessus
Questions:
1. D'après ce que je comprends du message d'erreur, RedisConnectionFactory
n'a pas pu se charger car il ne trouve ni pilotes Jedis ni Lettuce. Ne devrait pas spring-session-data-redis
apporter un de ces pilotes par défaut?
2. Comment résoudre ce problème au cas où je souhaiterais utiliser le pilote Jedis?
3. Comment résoudre ce problème au cas où je souhaiterais utiliser le pilote Lettuce?
1.
Comme @ M.Deinum mentionné, spring-session-data-redis
(version 2.1.0.M1) ne tire pas les pilotes Jedis ou Lettuce.
2.
Ajoutez le dernier pilote Jedis en tant que dépendance explicite:
dependencies {
// ...
compile 'redis.clients:jedis:2.9.0'
}
3.
Soit ajoutez spring-boot-starter-data-redis
(qui extrait le pilote Lettuce) ou le dernier pilote Lettuce comme dépendance explicite:
dependencies {
// ...
compile 'org.springframework.boot:spring-boot-starter-data-redis'
// OR
compile 'io.lettuce:lettuce-core:5.0.5.RELEASE'
}
Il y a 2 implémentations de RedisConnectionFactory
sont livrées avec spring-session-data-redis
(1) laitue (par défaut) - https://github.com/spring-projects/spring-session/issues/789
(2) Jedis
Étant donné que la dépendance à la laitue et aux Jedis est facultative, vous devez avoir une dépendance explicite. vous pouvez mettre la dépendance à l'un ou l'autre. (u peut avoir les deux mais le stater d'implémentation Spring redis utilise la laitue comme implémentation par défaut)
Exemple:
<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>