使用spring-boot-starter-data-redis出现SafeEncoder类找不到异常求助
问题分析与解决办法
核心原因
java.lang.ClassNotFoundException: redis.clients.jedis.util.SafeEncoder 本质是Jedis版本冲突导致的:
- Spring Boot 2.7.9 默认依赖的 Jedis 版本是 3.9.0,这个版本里
SafeEncoder类位于redis.clients.util包下,而非报错里的redis.clients.jedis.util。 - 当项目中引入了 Jedis 4.x 版本时,这个类会被直接移除,同时旧的包路径也不存在,一旦有代码(可能是你的RedisConfig、Spring Data Redis内部逻辑或Camunda的依赖)尝试调用这个类,就会抛出找不到类的异常。
排查与解决步骤
1. 先排查实际依赖的Jedis版本
用Maven或Gradle命令查看项目依赖树,找出哪个组件引入了冲突的Jedis版本:
- Maven:执行
mvn dependency:tree,搜索redis.clients:jedis,看是否有4.x版本被引入。 - Gradle:执行
./gradlew dependencies,同样搜索Jedis相关条目。
2. 锁定兼容的Jedis版本
在项目的依赖管理中强制指定Spring Boot 2.7.x兼容的Jedis 3.9.0版本,覆盖其他依赖引入的高版本:
- Maven(在
pom.xml的dependencyManagement中添加):<dependencyManagement> <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.9.0</version> </dependency> </dependencies> </dependencyManagement> - Gradle(在
build.gradle中添加约束):dependencies { constraints { implementation 'redis.clients:jedis:3.9.0' } }
3. 检查自定义代码是否直接调用了SafeEncoder
如果你的RedisConfig或其他业务代码里有直接使用SafeEncoder的地方,建议替换为JDK标准的编码方式,比如:
// 替换之前的SafeEncoder.encode("xxx") byte[] encoded = "你的字符串".getBytes(StandardCharsets.UTF_8);
这种写法不依赖Jedis的工具类,兼容性更强。
4. 排除Camunda依赖中的冲突Jedis
如果排查后发现是Camunda 7.19.0的某个依赖引入了高版本Jedis,直接排除该依赖即可:
<dependency> <groupId>org.camunda.bpm.springboot</groupId> <artifactId>camunda-bpm-spring-boot-starter</artifactId> <version>7.19.0</version> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Issatay Tleuov
相关产品推荐
相关产品推荐

