You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本极易引发冲突:

  • 解决步骤:
    1. 打开build.gradle,移除所有手动指定的Jedis版本依赖(比如implementation 'redis.clients:jedis:x.x.x')
    2. 仅保留Spring Boot Starter依赖:
      dependencies {
          implementation 'org.springframework.boot:spring-boot-starter-data-redis'
      }
      
    3. 执行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)正确写法:
    @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);
    }
    
    注:2.7.x中RedisProperties的池配置已标准化为PoolConfig类,无需手动创建JedisPoolConfig。

三、处理JUnit测试环境的Redis依赖

测试环境若无实际Redis服务,2.7.x不会自动 fallback到嵌入式Redis,导致初始化失败:

  • 方案1:引入嵌入式Redis
    在build.gradle添加测试依赖:
    testImplementation 'it.ozimov:embedded-redis:0.7.3'
    
    测试类中启停嵌入式Redis:
    @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:17:48