记springboot升级导致的redisTemplate自动配置失败

springboot原始版本:2.2.4,springboot升级版本:2.6.4

现象:

项目因为业务需要,自定义的redis配置类里,声明了3个redisConnectionFactory,3个redistemplate,且命名不是“redistemplate“、和“stringRedisTemplate“。

service实现类里注入了redisTemplate、stringRedisTemplate。

之前的版本,是可以成功注入并运行的,升级版本后,运行项目,报错:

看到此类报错,直接在自定义的redis配置文件里声明了一个stringRedisTemplate,即可暴力解决,但是思考下,之前版本可以,为什么现在的版本,不行了呢?

而springboot可以自动配置redisTemplate的,按理说就算不在配置中心配置,也可以成功引入redisTemplate。说到这里,我们看下springboot是如何自动配置redisTemplate的(参考:redistemplate是如何在springboot中自动配置的_且行且珍惜、的博客-CSDN博客_"@bean(name = \"redistemplate\")"),首先要找到它的自动配置类,在spring-boot-autoconfigure.jar 下的spring.factories,搜索下redis可以找到具体的默认配置bean。

进入到RedisAutoConfiguration查看他的源码

项目用debug方式运行,查看自动配置情况,发现stringRedisTemplate并没有自动配置成功,因为redisFactory有多个,没有指定首选:

 然后在redis自定义配置文件里,将一个redisFactory指定为首选,运行项目就可以成功了。

 

还是那个老问题,之前版本没有指定首选,怎么就可以成功呢,所以就比对了两个版本的redisTemplate自动配置类,旧版本如下:

新版本如下:

 

发现,新版本多了一个注解, @ConditionalOnSingleCandidate,该注解表示当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean。因为在自定义的redis配置类有3个redisFactory,并且没有指定首选,所以配置redisTemplate、stringRedisTemplate失败,破案!

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过以下步骤使用nacos动态修改springboot下的RedisTemplate连接池配置: 1. 在pom.xml文件中添加nacos-spring-boot-starter和spring-boot-starter-actuator依赖。 2. 在application.properties文件中配置nacos相关信息,如下所示: ``` spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=your-namespace spring.cloud.nacos.config.group=your-group spring.cloud.nacos.config.prefix=your-prefix ``` 3. 在RedisConfig.java文件中定义RedisTemplate,并使用@RefreshScope注解标该类,如下所示: ``` @Configuration @RefreshScope public class RedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; @Value("${spring.redis.jedis.pool.max-wait}") private long maxWait; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxActive); jedisPoolConfig.setMaxWaitMillis(maxWait); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMinIdle(minIdle); return jedisPoolConfig; } @Bean public RedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName(host); redisStandaloneConfiguration.setPort(port); redisStandaloneConfiguration.setPassword(RedisPassword.of(password)); JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolingClientConfigurationBuilder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder(); jedisPoolingClientConfigurationBuilder.poolConfig(jedisPoolConfig()); JedisClientConfiguration jedisClientConfiguration = jedisPoolingClientConfigurationBuilder.build(); return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } } ``` 在上述代码中,我们使用@Value注解从配置文件中获取Redis连接池相关的参数,然后使用JedisPoolConfig和JedisClientConfiguration配置连接池,并使用RedisTemplate配置Redis连接工厂和RedisTemplate。 4. 在nacos配置中心添加配置信息,如下所示: ``` spring.redis.jedis.pool.max-active=500 spring.redis.jedis.pool.max-wait=5000 spring.redis.jedis.pool.max-idle=10 spring.redis.jedis.pool.min-idle=2 ``` 在上述配置中,我们只修改了Redis连接池的相关参数。 5. 在需要动态修改Redis连接池配置的地方,使用@Value注解注入Redis连接池相关参数,如下所示: ``` @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; @Value("${spring.redis.jedis.pool.max-wait}") private long maxWait; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; ``` 6. 使用Spring Cloud Bus和Spring Cloud Config实现配置的动态刷新,如下所示: - 在pom.xml文件中添加spring-cloud-starter-bus-amqp和spring-cloud-starter-config依赖。 - 在application.properties文件中添加如下配置: ``` spring.cloud.bus.enabled=true spring.cloud.bus.trace.enabled=true spring.cloud.config.server.rabbitmq.enabled=true spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` - 在RedisConfig.java文件中使用@RefreshScope注解标该类。 - 在需要动态刷新配置的地方,使用@Value注解注入配置参数。 - 使用POST请求发送/bus/refresh接口,可以实现配置的动态刷新。 以上就是使用nacos动态修改springboot下的RedisTemplate连接池配置的全部步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值