Spring Boot引入两个Maven依赖后RestTemplate类型Bean冲突如何解决
问题原因
No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected single matching bean but found 2: externalDependencyOneRestTemplate,externalDependencyTwoRestTemplate
这个报错是Spring依赖注入时的类型匹配冲突:当前Spring上下文中存在两个RestTemplate类型的Bean,你通过@Autowired按类型注入时,框架无法自动判断要选择哪个实例,因此抛出异常。
修复方案
你确实需要为AClassUsingRestTemplate指定使用的RestTemplate实现,可根据你的实际场景选择以下任意一种方案:
- 方案1:给你可控的
RestTemplateBean添加@Primary注解(无需修改原有注入逻辑,成本最低)
直接调整你可控依赖中的Bean定义,添加@Primary后,Spring按类型注入RestTemplate时会优先选择这个标记了主实例的Bean,代码修改如下:@Primary // 新增主实例注解 @Bean(name = "externalDependencyOneRestTemplate") public RestTemplate buildExternalDependencyOneRestTemplate() { final HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build()); final RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(restTemplate.getRequestFactory())); return restTemplate; } - 方案2:在
RestTemplate注入点使用@Qualifier指定Bean名称
如果你可以修改AClassUsingRestTemplate中RestTemplate的注入代码,直接在@Autowired旁补充@Qualifier指定要使用的Bean名即可:@Autowired @Qualifier("externalDependencyOneRestTemplate") // 指定要注入的Bean名称 private RestTemplate restTemplate; - 方案3:手动声明
AClassUsingRestTemplate的Bean定义并传入指定RestTemplate
如果你不能修改依赖中的AClassUsingRestTemplate代码,也可以在自己的项目中手动定义该类的Bean,构造时传入你指定的RestTemplate实例:@Bean public AClassUsingRestTemplate aClassUsingRestTemplate(@Qualifier("externalDependencyOneRestTemplate") RestTemplate restTemplate) { // 如果AClassUsingRestTemplate提供了带RestTemplate参数的构造方法,直接传入即可 return new AClassUsingRestTemplate(restTemplate); }
内容的提问来源于stack exchange,提问作者Jjufi21
相关产品推荐
相关产品推荐

