背景

有个新项目需要启动。

因为有部分业务的请求相对来讲比其它的要强的多。

而且还受到第三方的影响较深

基于这种情况,微服务的使用方式就提上了日程。

原来两年前的微服务架构,考虑到技术的变化,就准备升级了下包

看到最新的2021版本已经出炉了。

解决了那么多的bug,不升级都对不起自己了,关键这个还是新项目,没有负担。

那么就升级最新版本

问题

前面都很OK,在启动服务的时候,提示了以下错误。

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'redisTemplate', defined in class path resource [com/XX/XX/redis/autoconfigure/RedisAutoConfigure.class], could not be registered. A bean with that name has already been defined in class path resource [org/redisson/spring/starter/RedissonAutoConfiguration.class] and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

上面说是因为bean名称重复了,设置spring.main.allow-bean-definition-overriding=true来解决。

但是我实际再bootstrap.yaml中已经设置了当前值。

那么结果已经很明显了,就是spring.main.allow-bean-definition-overriding=true没有生效。

解决方案

既然没有生效,那就让他生效好了。

生效的方式有两个

方案1:代码强制生效

一个是修改代码,在启动的main方法中强制设置allow-bean-definition-overriding=true

 public static void main(String[] args) {
       SpringApplication application = new SpringApplication(ApplicationRun.class);
       application.setAllowBeanDefinitionOverriding(true);
       application.run(args);
}

方案2:增加相关依赖包

新的版本中,springcloud把bootstrap等单独拆分了出来。

所以需要单独引入bootstrap包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

这两种方案,重新编译后运行都一切正常

总结

升级新版本好处多多,但是版本升级不要一下跨度太大。这样的话相关的包之间的引用就会产生一些版本不兼容的问题。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐