环境信息
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
这个是由于 Dubbo 3 中 spring 把所有的 reference bean 都注册到 spring 去了。如果没有指定一个 bean 去 autowire 的话也没法决策是使用本地发布的(service bean)还是订阅的(甚至可能有多个,配置不一样)。
所以最好是在升级的时候把有问题的都处理掉,提前排除风险。
原回答者GitHub用户AlbumenJ
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。