Spring Boot Redis与Jedis迁移至Jedis 4.2的适配问题求助
解决Spring Boot 2.7.3与Jedis 4.x兼容问题
问题核心:Spring Boot 2.7.3配套的Spring Data Redis 2.7.x版本未适配Jedis 4.x的API变更(Jedis 4.x移除了JedisShardInfo类,但Spring Data Redis 2.7.x的JedisConnectionFactory仍依赖该类),导致出现class file for redis.clients.jedis.JedisShardInfo not found错误。
以下是三种可行解决方案,按推荐优先级排序:
方案1:升级Spring Boot至3.x版本(推荐长期方案)
Spring Boot 3.0及以上版本对应的Spring Data Redis 3.x已完全适配Jedis 4.x,无需修改原有业务代码。只需将Spring Boot版本升级到3.x(如3.0.0+),保留Jedis 4.2.3依赖即可,原有的RedisTemplate配置可直接正常运行。
方案2:降级Jedis至Spring Boot 2.7.x兼容版本(快速临时方案)
Spring Boot 2.7.3默认适配的Jedis版本为3.9.0,使用该版本可直接规避兼容性问题,无需改动代码:
Maven配置示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.9.0</version> </dependency>
Gradle配置示例:
implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'redis.clients:jedis:3.9.0'
方案3:自定义连接配置绕过JedisShardInfo依赖(不推荐,复杂度高)
若必须同时保留Spring Boot 2.7.3和Jedis 4.x,需手动构建连接逻辑替换Spring默认的JedisConnectionFactory:
- 排除Spring Data Redis自带的Jedis依赖,避免版本冲突:
Maven配置示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.3</version> </dependency>
- 自定义
RedisConnectionFactory,直接使用Jedis 4.x的连接池API:
import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.GenericToStringSerializer; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.Serializable; @Bean public RedisConnectionFactory jedisConnectionFactory() { return new RedisConnectionFactory() { private final JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), endpoint, port); @Override public RedisConnection getConnection() { return new org.springframework.data.redis.connection.jedis.JedisConnection(jedisPool.getResource()); } // 实现接口其他方法,默认返回空或false即可 @Override public boolean getConvertPipelineAndTxResults() { return false; } @Override public void setConvertPipelineAndTxResults(boolean convertPipelineAndTxResults) {} }; } @Bean public RedisTemplate<String, String> redisTemplate() { final RedisTemplate<String, String> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericToStringSerializer<>(Serializable.class)); template.setValueSerializer(new GenericToStringSerializer<>(Serializable.class)); return template; }
注意:此方案需手动实现RedisConnectionFactory的部分接口方法,且Spring Data Redis的高级特性(如集群、哨兵模式)可能无法正常工作,仅作为应急临时方案使用。
内容的提问来源于stack exchange,提问作者mpartan
相关产品推荐
相关产品推荐

