Skip to content

Commit 1e7d04c

Browse files
committed
Fix searching for qualified bean.
1 parent 7778198 commit 1e7d04c

File tree

4 files changed

+31
-33
lines changed

4 files changed

+31
-33
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/interfaceclients/AbstractInterfaceClientsFactoryBean.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import org.springframework.context.ApplicationContextAware;
2424
import org.springframework.util.Assert;
2525

26-
import static com.mysema.commons.lang.Assert.assertThat;
27-
2826
/**
2927
* @author Olga Maciaszek-Sharma
3028
*/

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/interfaceclients/http/HttpInterfaceClientsAutoConfiguration.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,19 @@
1616

1717
package org.springframework.boot.autoconfigure.interfaceclients.http;
1818

19-
import org.springframework.beans.factory.ObjectProvider;
2019
import org.springframework.boot.autoconfigure.AutoConfiguration;
21-
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2220
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
23-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2421
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
25-
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
2622
import org.springframework.boot.autoconfigure.web.client.NotReactiveWebApplicationCondition;
2723
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2824
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
2925
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
3026
import org.springframework.boot.context.properties.EnableConfigurationProperties;
31-
import org.springframework.boot.web.client.RestTemplateBuilder;
32-
import org.springframework.context.annotation.Bean;
3327
import org.springframework.context.annotation.Conditional;
3428
import org.springframework.context.annotation.Configuration;
3529
import org.springframework.context.annotation.Import;
3630
import org.springframework.web.client.RestClient;
37-
import org.springframework.web.client.RestTemplate;
3831
import org.springframework.web.client.support.RestClientAdapter;
39-
import org.springframework.web.client.support.RestTemplateAdapter;
40-
import org.springframework.web.reactive.function.client.WebClient;
41-
import org.springframework.web.reactive.function.client.support.WebClientAdapter;
4232
import org.springframework.web.service.invoker.HttpServiceProxyFactory;
4333

4434
/**

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/interfaceclients/http/QualifiedBeanProvider.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package org.springframework.boot.autoconfigure.interfaceclients.http;
1818

19+
import java.util.Map;
20+
1921
import org.apache.commons.logging.Log;
2022
import org.apache.commons.logging.LogFactory;
2123

2224
import org.springframework.beans.factory.ListableBeanFactory;
23-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
24-
import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils;
25-
import org.springframework.boot.autoconfigure.interfaceclients.InterfaceClientsAdapter;
25+
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
26+
27+
import static org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils.qualifiedBeansOfType;
2628

2729
/**
2830
* @author Olga Maciaszek-Sharma
@@ -32,25 +34,26 @@ final class QualifiedBeanProvider {
3234
private static final Log logger = LogFactory.getLog(QualifiedBeanProvider.class);
3335

3436
static <T> T qualifiedBean(ListableBeanFactory beanFactory, Class<T> type, String clientId) {
35-
try {
36-
return BeanFactoryAnnotationUtils.qualifiedBeanOfType(beanFactory, type, clientId);
37+
Map<String, T> matchingClientBeans = qualifiedBeansOfType(beanFactory, type, clientId);
38+
if (matchingClientBeans.size() > 1) {
39+
throw new NoUniqueBeanDefinitionException(type, matchingClientBeans.keySet());
3740
}
38-
catch (NoSuchBeanDefinitionException ignored) {
41+
if (matchingClientBeans.isEmpty()) {
3942
if (logger.isDebugEnabled()) {
4043
logger.debug("No qualified bean of type " + type + " found for " + clientId);
4144
}
42-
}
43-
// Get default-qualified bean
44-
try {
45-
return BeanFactoryAnnotationUtils.qualifiedBeanOfType(beanFactory, type,
46-
InterfaceClientsAdapter.DEFAULT_QUALIFIER);
47-
}
48-
catch (NoSuchBeanDefinitionException ignored) {
49-
if (logger.isDebugEnabled()) {
50-
logger.debug("No qualified of type " + type + "found for " + InterfaceClientsAdapter.DEFAULT_QUALIFIER);
45+
Map<String, T> matchingDefaultBeans = qualifiedBeansOfType(beanFactory, type, clientId);
46+
if (matchingDefaultBeans.size() > 1) {
47+
throw new NoUniqueBeanDefinitionException(type, matchingDefaultBeans.keySet());
48+
}
49+
if (matchingDefaultBeans.isEmpty()) {
50+
if (logger.isDebugEnabled()) {
51+
logger.debug("No qualified bean of type " + type + " found for default id");
52+
}
53+
return null;
5154
}
5255
}
53-
return null;
56+
return matchingClientBeans.values().iterator().next();
5457
}
5558

5659
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/interfaceclients/http/RestClientInterfaceClientsFactoryBean.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,31 @@ public class RestClientInterfaceClientsFactoryBean extends AbstractHttpInterface
3232

3333
@Override
3434
protected HttpExchangeAdapter exchangeAdapter() {
35+
HttpInterfaceClientsProperties properties = this.applicationContext
36+
.getBean(HttpInterfaceClientsProperties.class);
37+
// If the user wants to set the baseUrl directly on the builder,
38+
// it should not be set in properties.
39+
String baseUrl = properties.getProperties(this.clientId).getBaseUrl();
40+
3541
RestClient userProvidedRestClient = QualifiedBeanProvider.qualifiedBean(this.applicationContext,
3642
RestClient.class, this.clientId);
3743
if (userProvidedRestClient != null) {
44+
if (baseUrl != null) {
45+
userProvidedRestClient = userProvidedRestClient.mutate().baseUrl(baseUrl).build();
46+
}
3847
return RestClientAdapter.create(userProvidedRestClient);
3948
}
40-
HttpInterfaceClientsProperties properties = this.applicationContext
41-
.getBean(HttpInterfaceClientsProperties.class);
42-
String baseUrl = properties.getProperties(this.clientId).getBaseUrl();
49+
4350
RestClient.Builder userProvidedRestClientBuilder = QualifiedBeanProvider.qualifiedBean(this.applicationContext,
4451
RestClient.Builder.class, this.clientId);
4552
if (userProvidedRestClientBuilder != null) {
46-
// If the user wants to set the baseUrl directly on the builder,
47-
// it should not be set in properties.
53+
4854
if (baseUrl != null) {
4955
userProvidedRestClientBuilder.baseUrl(baseUrl);
5056
}
5157
return RestClientAdapter.create(userProvidedRestClientBuilder.build());
5258
}
59+
5360
// create a RestClientAdapter bean with default implementation
5461
if (logger.isDebugEnabled()) {
5562
logger.debug("Creating RestClientAdapter for '" + this.clientId + "'");

0 commit comments

Comments
 (0)