Spring Boot 2.5.4应用JedisClient初始化抛出ClassNotFoundException如何解决
问题根因
报错是由于jedis版本与Spring Boot 2.5.4配套的Spring Data Redis版本不兼容导致:DefaultJedisClientConfig 是jedis 3.2版本之后才新增的类,你当前使用的jedis 3.1.0版本中不存在该类,同时你手动指定的spring-boot-starter-data-redis 2.5.0也和父pom的Spring Boot 2.5.4版本存在微小差异,进一步增加了兼容性风险。
解决方案
直接使用Spring Boot父pom自带的依赖版本管理即可,父pom已经为所有官方starter配套了经过完整兼容性测试的版本,无需手动指定版本号:
1. 修改pom.xml依赖配置
先删除properties节点下的spring-boot-starter-redis.version和redis.version两个自定义属性,再调整Redis相关依赖如下:
<!-- 去掉version属性,直接继承父pom的配套版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <!-- 删除多余的type标签,版本直接继承父pom的3.7.1即可,完全适配Spring Boot 2.5.4 --> </dependency>
如果一定要手动指定版本保证对齐,可固定为以下经过验证的兼容组合:
- spring-boot-starter-data-redis:2.5.4(和父pom Spring Boot版本完全一致)
- jedis:3.7.1(Spring Boot 2.5.4官方适配的jedis版本)
2. 可选配置优化
你现有的RedisConfiguration配置类逻辑本身没有问题,版本修复后可以直接正常运行。如果不需要自定义RedisTemplate的特殊配置,也可以直接删除该配置类,Spring Boot会自动根据你引入的redis.properties配置自动装配JedisConnectionFactory和RedisTemplate,无需手动编写。
如果后续需要解决Redis序列化乱码问题,可以在RedisTemplate的Bean定义中补充序列化配置:
@Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); // 使用String序列化器处理key template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 使用Jackson序列化器处理value Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); jacksonSerializer.setObjectMapper(objectMapper); template.setValueSerializer(jacksonSerializer); template.setHashValueSerializer(jacksonSerializer); template.afterPropertiesSet(); return template; }
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

