开发者社区 > 云原生 > 正文

dubbo2.7.13升级到3.0.11版本 兼容性问题启动报错 Dubbo2.7.13 Upgra

环境信息

Dubbo version: 2.7.13 升级到3.0.11 Operating System version: window Java version: 1.8

步骤重现

1、当一个应用实例的某个接口在本应用中用 @Autowired 注入过,并且在本应用其他的业务用@DubboReference 过。

2、因为历史项目原因 @Autowired定义的属性名不是很规范 spring容器是按照类型查找。这种就会出现2个type一样的bean 就报错了,此现状在2.7.13中是正常能跑的 看有好的办法兼容吗

示例如下

https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider 把dubbo版本改为3.0.11 samples默认的这个版本应该也是有问题的。 新增IDemoService2.java DemoService2Impl.java

IDemoService2.java 接口定义

public interface IDemoService2 { }

DemoService2Impl.java 接口实现

@DubboService public class DemoService2Impl implements IDemoService2 { @Autowired private DemoService demoService;

@DubboReference
private DemoService demoServiceRemote;
public void tet(){

}

}

启动异常

`022-12-06 10:58:38.011 WARN 26068 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoService2': Unsatisfied dependency expressed through field 'demoService'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.dubbo.springboot.demo.DemoService' available: expected single matching bean but found 2: demoServiceImpl,demoServiceRemote 2022-12-06 10:58:38.020 INFO 26068 --- [ main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-12-06 10:58:38.023 ERROR 26068 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :

Description:

Field demoService in org.apache.dubbo.springboot.demo.provider.DemoService2 required a single bean, but 2 were found: - demoServiceImpl: defined in file [D:\opensource\dubbo-samples\1-basic\dubbo-samples-spring-boot\dubbo-samples-spring-boot-provider\target\classes\org\apache\dubbo\springboot\demo\provider\DemoServiceImpl.class] - demoServiceRemote: defined in null

Action:

Consider marking one of the beans as @primary, updating the consumer to accept multiple beans, or using @qualifier to identify the bean that should be consumed

原提问者GitHub用户peachyy

展开
收起
大圣东游 2023-05-11 15:54:16 220 0
1 条回答
写回答
取消 提交回答
  • 这个是由于 Dubbo 3 中 spring 把所有的 reference bean 都注册到 spring 去了。如果没有指定一个 bean 去 autowire 的话也没法决策是使用本地发布的(service bean)还是订阅的(甚至可能有多个,配置不一样)。

    所以最好是在升级的时候把有问题的都处理掉,提前排除风险。

    原回答者GitHub用户AlbumenJ

    2023-05-12 10:24:44
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载