作者:262610 | 来源:互联网 | 2023-06-06 10:30
前言昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError:orgapachecommo
前言
昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig,错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的,并且如何解决。
错误回顾
在SpringBoot 2.0+后,默认的redis client是lettuce而不是一直使用的jedis。此次出现的错误也是因为使用了lettuce出现的。
使用时的配置如下所示:
spring:redis:host: localhostport: 6379password:timeout: 10slettuce:pool:min-idle: 0max-idle: 8max-active: 8max-wait: -1ms
pom使用最小的依赖进行测试验证。
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>
dependency>
测试代码&#xff0c;期望结果是控制台显示 123456&#xff0c;表明redis可以正常使用。
&#64;SpringBootTest
public class RedisServiceTest {&#64;Autowiredprivate RedisTemplate<Object, Object> redisTemplate;&#64;Testpublic void testRedis() {redisTemplate.opsForValue().set("test", "123456");String abec &#61; (String) redisTemplate.opsForValue().get("test");System.out.println(abec);}
}
测试验证结果&#xff1a;
问题原因
跟踪一下源码发现就能轻松的发现问题&#xff1a;
既然使用的事lettuce client&#xff0c;程序中会通过yml配置匹配到LettuceConnectionConfiguration来创建连接池&#xff0c;所以看此类的源码就能得到答案。
&#64;Bean
&#64;ConditionalOnMissingBean(RedisConnectionFactory.class)
LettuceConnectionFactory redisConnectionFactory(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources) {LettuceClientConfiguration clientConfig &#61; getLettuceClientConfiguration(builderCustomizers, clientResources,getProperties().getLettuce().getPool());return createLettuceConnectionFactory(clientConfig);
}
private LettuceClientConfiguration getLettuceClientConfiguration(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources, Pool pool) {LettuceClientConfigurationBuilder builder &#61; createBuilder(pool);applyProperties(builder);if (StringUtils.hasText(getProperties().getUrl())) {customizeConfigurationFromUrl(builder);}builder.clientOptions(createClientOptions());builder.clientResources(clientResources);builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return builder.build();
}
private LettuceClientConfigurationBuilder createBuilder(Pool pool) { if (pool &#61;&#61; null) {return LettuceClientConfiguration.builder();}return new PoolBuilderFactory().createBuilder(pool);
}
最后执行的方法截图能明显发现错误
&#x1f602;最后发现就是很简单的问题&#xff0c;很单纯的没有引入commons-pool2的jar包。问题原因就是自己不按照人要求做事&#xff0c;还逼逼赖赖~~ &#xff08;无能的人儿啊&#xff09;
解决方法
&#x1f4e2;那就如她所愿&#xff0c;增加上新的pom依赖
<dependency><groupId>org.apache.commonsgroupId><artifactId>commons-pool2artifactId>
dependency>
&#x1f923;宾狗-------验证通过
当然还有一种方法&#xff0c;就是yml配置文件中不要配置lettuce.pool配置项&#xff0c;这样初始化就执行默认的连接池了。&#x1f914;但是好像不配置的话又不符合企业级应用要求&#xff0c;所以还是当一个听话的好孩子吧&#xff0c;这样在之后出错的话就会有人站出来为你说一句: “他还是个孩子啊!!~”
&#x1f51a;
这次记录就到这里啦~ 献给努力的我们。