Spring Boot升级至2.7.10后JUnit执行触发MalformedParameterizedTypeException
Spring Boot 2.7.10升级后JUnit测试中JedisConnectionFactory初始化异常解决方法
核心问题背景
从Spring Boot 2.3.2.RELEASE升级到2.7.10(漏洞修复)后,Java 11 + Gradle 7.1.1环境下执行gradle clean build时,JUnit测试阶段触发RedisConfiguration中JedisConnectionFactory Bean初始化异常,仅在2.7.10版本的测试构建中出现,旧版本无此问题。
一、优先排查依赖冲突
Spring Boot 2.7.x对Jedis依赖版本做了升级(2.3.2默认Jedis 3.3.x,2.7.10默认3.9.x),手动指定的Jedis版本极易引发冲突:
- 解决步骤:
- 打开
build.gradle,移除所有手动指定的Jedis版本依赖(比如implementation 'redis.clients:jedis:x.x.x') - 仅保留Spring Boot Starter依赖:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' } - 执行
gradle dependencies | grep jedis验证,确保只有Spring Boot管理的Jedis版本存在。
- 打开
二、调整RedisConfiguration的API适配
Spring Boot 2.7.x废弃了部分旧版JedisConnectionFactory的配置API,需调整Bean初始化代码:
- 旧版(2.3.x)错误写法:
@Bean public JedisConnectionFactory jedisConnectionFactory(RedisProperties props) { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(props.getJedis().getPool().getMaxActive()); poolConfig.setMaxIdle(props.getJedis().getPool().getMaxIdle()); JedisConnectionFactory factory = new JedisConnectionFactory(poolConfig); factory.setHostName(props.getHost()); factory.setPort(props.getPort()); return factory; } - 新版(2.7.x)正确写法:
注:2.7.x中@Bean public JedisConnectionFactory jedisConnectionFactory(RedisProperties props) { // 构建客户端配置(含池化配置) JedisClientConfiguration clientConfig = JedisClientConfiguration.builder() .usePooling() .poolConfig(props.getJedis().getPool().getPoolConfig()) .build(); // 构建独立Redis服务器配置 RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration(); standaloneConfig.setHostName(props.getHost()); standaloneConfig.setPort(props.getPort()); if (props.getPassword() != null) { standaloneConfig.setPassword(RedisPassword.of(props.getPassword())); } return new JedisConnectionFactory(standaloneConfig, clientConfig); }RedisProperties的池配置已标准化为PoolConfig类,无需手动创建JedisPoolConfig。
三、处理JUnit测试环境的Redis依赖
测试环境若无实际Redis服务,2.7.x不会自动 fallback到嵌入式Redis,导致初始化失败:
- 方案1:引入嵌入式Redis
在build.gradle添加测试依赖:
测试类中启停嵌入式Redis:testImplementation 'it.ozimov:embedded-redis:0.7.3'@SpringBootTest public class RedisDependentTest { private RedisServer redisServer; @BeforeEach void initRedis() { redisServer = new RedisServer(6379); redisServer.start(); } @AfterEach void shutdownRedis() { if (redisServer != null) { redisServer.stop(); } } // 测试逻辑 } - 方案2:Mock Redis连接工厂
若测试无需实际Redis交互,直接Mock Bean跳过初始化:@SpringBootTest @MockBean(JedisConnectionFactory.class) public class ServiceWithoutRedisTest { // 测试逻辑,此时JedisConnectionFactory不会触发实际初始化 }
四、同步application.properties配置键
Spring Boot 2.7.x调整了部分Redis配置键(兼容旧键但建议统一):
- 旧键:
spring.redis.jedis.pool.max-active→ 新键:spring.redis.jedis.pool.max-total - 确保测试环境配置(
application-test.properties)正确,示例:spring.redis.host=localhost spring.redis.port=6379 spring.redis.jedis.pool.max-total=10 spring.redis.jedis.pool.max-idle=5
五、Gradle构建日志定位细节
若以上方案未解决,执行gradle clean build --info获取完整堆栈日志,重点查看:
- 是否存在类找不到的错误(依赖缺失)
- 配置参数绑定失败的提示(比如属性名错误)
- 连接超时或权限问题(测试环境Redis未启动)
内容的提问来源于stack exchange,提问作者Natraj
相关产品推荐
相关产品推荐

