Spring Boot 2.7.12应用出现JedisClientConfig的NoClassDefFoundError错误求助
java.lang.NoClassDefFoundError问题 错误栈信息
Cannot resolve reference to bean 'redisKeyValueTemplate' while setting bean property 'keyValueOperations'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisKeyValueTemplate': Cannot resolve reference to bean 'redisKeyValueAdapter' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisKeyValueAdapter': Cannot resolve reference to bean 'redisTemplate' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplate' defined in class path resource [ru/axothy/backdammon/registration/config/RedisConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.redis.core.RedisTemplate]: Factory method 'redisTemplate' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jedisConnectionFactory' defined in class path resource [ru/axothy/backdammon/registration/config/RedisConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.redis.connection.jedis.JedisConnectionFactory]: Factory method 'jedisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/JedisClientConfig
RedisConfig配置类代码
@Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(); jedisConFactory.setHostName("127.0.0.1"); jedisConFactory.setPort(6379); return jedisConFactory; } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); return template; } }
build.gradle配置
plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'ru.axothy.backdammon' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext { set('springCloudVersion', "2021.0.7") } dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-config' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bootstrap', version: '3.1.6' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client', version: '3.1.6' implementation group: 'org.keycloak', name: 'keycloak-admin-client', version: '21.1.1' implementation group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: '3.1.2' implementation group: 'org.glassfish.jersey.core', name: 'jersey-server', version: '3.1.2' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } tasks.named('test') { useJUnitPlatform() }
问题描述
开发Spring Boot 2.7.12版本应用,通过Spring Data Redis访问Redis服务,启动时出现上述NoClassDefFoundError错误。已尝试移除build.gradle中的jedis依赖,但问题未解决,请问哪里操作出错了?
问题原因与解决方案
核心原因
NoClassDefFoundError: redis/clients/jedis/JedisClientConfig说明项目运行时缺少Jedis客户端核心类。spring-boot-starter-data-redis默认使用Lettuce作为Redis客户端,而非Jedis;你手动配置了JedisConnectionFactory,但未引入Jedis依赖包,导致类找不到。
解决方案(二选一即可)
方案1:改用Lettuce连接工厂(推荐,符合Spring Boot默认配置)
修改RedisConfig类,替换为Lettuce连接工厂,无需额外引入依赖:
@Configuration public class RedisConfig { @Bean LettuceConnectionFactory lettuceConnectionFactory() { LettuceConnectionFactory lettuceConFactory = new LettuceConnectionFactory(); lettuceConFactory.setHostName("127.0.0.1"); lettuceConFactory.setPort(6379); return lettuceConFactory; } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(lettuceConnectionFactory()); // 建议添加序列化配置,避免默认JDK序列化的问题 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }
方案2:添加Jedis依赖包
若坚持使用Jedis,需在build.gradle的dependencies中明确引入Jedis依赖,并排除默认的Lettuce依赖:
implementation('org.springframework.boot:spring-boot-starter-data-redis') { exclude group: 'io.lettuce', module: 'lettuce-core' } implementation 'redis.clients:jedis' // Spring Boot 2.7.x会自动适配对应版本,无需手动指定
额外注意点
你当前的JedisConnectionFactory初始化方式已过时,新版Jedis推荐通过RedisStandaloneConfiguration配置:
@Bean JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("127.0.0.1", 6379); return new JedisConnectionFactory(config); }
内容的提问来源于stack exchange,提问作者Ferich1

