web-dev-qa-db-fra.com

Impossible de démarrer l'application Spring-Boot après avoir configuré Spring-Session-Data-Redis

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?

7
Alex Lipov

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' 
} 
1
Alex Lipov

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>
1
Shehan Fernando