Spring Boot集成Jedis遇类缺失异常求助
问题重现
我定义了如下RedisConfig配置类:
@EnableRedisRepositories public class RedisConfig { @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); return new JedisConnectionFactory(redisStandaloneConfiguration); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new JdkSerializationRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setEnableTransactionSupport(true); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
构建项目时出现错误:
java: cannot access redis.clients.jedis.JedisPoolConfig class file for redis.clients.jedis.JedisPoolConfig not found
尝试移除RedisStandaloneConfiguration,直接返回new JedisConnectionFactory()后,原错误消失,但出现新异常:
Error creating bean with name 'jedisConnectionFactory' defined in class path resource [com/iplbetting/iplbettingtracker/config/RedisConfig.class]: Failed to instantiate [org.springframework.data.redis.connection.jedis.JedisConnectionFactory]: Factory method 'jedisConnectionFactory' threw exception with message: redis/clients/jedis/JedisClientConfig
排查后确定是java.lang.ClassNotFoundException: redis.clients.jedis.JedisClientConfig导致的。我使用spring-boot-starter-data-redis并排除了Lettuce依赖,也曾尝试添加3.x版本的Jedis依赖,但问题仍未解决。以下是我的pom.xml依赖配置:
<properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.2</version> </dependency>--> </dependencies>
请问我是否遗漏了某些配置?
解决方案
1. 引入兼容版本的Jedis依赖
问题核心是排除Lettuce后没有正确引入Jedis依赖,且手动指定的3.x版本可能和当前Spring Boot版本不兼容。不要手动指定Jedis版本,让Spring Boot的依赖管理自动匹配兼容版本:
修改pom.xml,取消注释Jedis依赖并移除版本号:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
2. 修正RedisConfig中的序列化配置错误
你的配置中重复调用了setHashKeySerializer,第二次调用会覆盖第一次的StringRedisSerializer,导致哈希键序列化方式不符合预期,修正如下:
@EnableRedisRepositories public class RedisConfig { @Bean public JedisConnectionFactory jedisConnectionFactory() { // 如果需要自定义Redis地址、密码等,在这里配置RedisStandaloneConfiguration RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); // 示例:config.setHostName("localhost"); config.setPort(6379); return new JedisConnectionFactory(config); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); // 键序列化用StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSerializer()); // 哈希键序列化用StringRedisSerializer redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // 哈希值序列化用JdkSerializationRedisSerializer redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); // 值序列化用JdkSerializationRedisSerializer redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setEnableTransactionSupport(true); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
3. 可选:简化配置(推荐)
如果不需要自定义Redis连接参数,Spring Boot会自动读取application.properties或application.yml中的配置(如spring.redis.host、spring.redis.port等),可以简化jedisConnectionFactory的配置:
@Bean public JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); }
内容的提问来源于stack exchange,提问作者Ameetesh Sharma

