SpringBoot集成Redis Sentinel报UnsatisfiedDependencyException求助
问题定位
你遇到的Bean创建失败级联报错,根因是Jedis版本与Spring Boot 2.6.6内置的Spring Data Redis版本不兼容。
报错链路里最底层的根异常java.lang.NoClassDefFoundError: redis/clients/jedis/GeoUnit是典型的类路径不匹配问题:
- Spring Boot 2.6.x 官方依赖管理默认适配的Jedis版本范围是3.7.x,这个版本区间内
GeoUnit类的路径就是redis.clients.jedis.GeoUnit - 你手动引入的Jedis 4.2.2属于大版本跨代升级,Jedis 4.x对内部包结构做了重构,
GeoUnit类的存放路径已经变更,Spring Data Redis 2.6.x版本的代码仍然按照3.x的路径加载类,自然触发类找不到错误。
上层抛出的UnsatisfiedDependencyException(localCacheManager、cacheManager、stringRedisTemplate创建失败)都是底层连接工厂初始化失败触发的级联错误,不需要单独排查。
修复方案
- 调整Maven依赖:删除pom.xml中手动给Jedis指定的4.2.2版本号,直接复用Spring Boot官方依赖管理对齐的适配版本,依赖配置参考:
<!-- 不需要手动指定spring-boot-starter-data-redis版本,和Spring Boot版本保持一致即可 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 不要加<version>标签,由Spring Boot父工程自动管理适配版本 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
调整后执行mvn clean compile,通过mvn dependency:tree | grep jedis命令确认实际引入的Jedis版本为3.7.x(Spring Boot 2.6.6默认对应3.7.12)即可。
- 清理配置类冗余注解:把自定义
RedisCacheConfig类上的@EnableAutoConfiguration注解移除,这个注解只需要加在项目启动类上,放在普通配置类上容易触发自动配置Bean和自定义Bean的冲突。 - 可选优化:如果没有特殊定制需求,不需要手动定义
JedisConnectionFactory、RedisSentinelConfigurationBean,只需要在application配置文件中填写sentinel节点、密码、主节点名等参数,Spring Boot会自动完成Sentinel模式的连接工厂装配,避免手动定义Bean时漏配参数导致的额外问题。 - 如果你必须使用Jedis 4.x版本,需要将Spring Boot版本升级到2.7.x及以上,2.7版本开始的Spring Data Redis才正式适配Jedis 4.x的重构后包结构,2.6.x版本无法兼容Jedis 4.x。
验证逻辑
依赖调整完成后重启服务,底层NoClassDefFoundError异常消失后,上层所有依赖注入失败的级联报错会自动解决,cacheManager、RedisTemplate等Bean会正常初始化。
内容的提问来源于stack exchange,提问作者Atique Ahmed
相关产品推荐
相关产品推荐

