Skip to content

Commit 2b07f21

Browse files
committed
Override default request headers and query param from default client config with specific client config. Fixes gh-715.
1 parent 45e975a commit 2b07f21

File tree

3 files changed

+48
-32
lines changed

3 files changed

+48
-32
lines changed

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.Collection;
21+
import java.util.HashMap;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Objects;
@@ -72,7 +73,7 @@
7273
* @author Hyeonmin Park
7374
* @author Felix Dittrich
7475
* @author Dominique Villard
75-
* @athor Can Bezmen
76+
* @author Can Bezmen
7677
*/
7778
public class FeignClientFactoryBean
7879
implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
@@ -178,6 +179,8 @@ protected void configureFeign(FeignClientFactory context, Feign.Builder builder)
178179
configureUsingProperties(properties.getConfig().get(contextId), builder);
179180
configureUsingConfiguration(context, builder);
180181
}
182+
configureDefaultRequestElements(properties.getConfig().get(properties.getDefaultConfig()),
183+
properties.getConfig().get(contextId), builder);
181184
}
182185
else {
183186
configureUsingConfiguration(context, builder);
@@ -298,9 +301,6 @@ protected void configureUsingProperties(FeignClientProperties.FeignClientConfigu
298301
builder.encoder(getOrInstantiate(config.getEncoder()));
299302
}
300303

301-
addDefaultRequestHeaders(config, builder);
302-
addDefaultQueryParams(config, builder);
303-
304304
if (Objects.nonNull(config.getDecoder())) {
305305
builder.decoder(getOrInstantiate(config.getDecoder()));
306306
}
@@ -322,33 +322,49 @@ protected void configureUsingProperties(FeignClientProperties.FeignClientConfigu
322322
}
323323
}
324324

325-
private void addDefaultQueryParams(FeignClientProperties.FeignClientConfiguration config, Feign.Builder builder) {
326-
Map<String, Collection<String>> defaultQueryParameters = config.getDefaultQueryParameters();
327-
if (Objects.nonNull(defaultQueryParameters)) {
328-
builder.requestInterceptor(requestTemplate -> {
329-
Map<String, Collection<String>> queries = requestTemplate.queries();
330-
defaultQueryParameters.keySet().forEach(key -> {
331-
if (!queries.containsKey(key)) {
332-
requestTemplate.query(key, defaultQueryParameters.get(key));
333-
}
334-
});
335-
});
325+
protected void configureDefaultRequestElements(FeignClientProperties.FeignClientConfiguration defaultConfig,
326+
FeignClientProperties.FeignClientConfiguration clientConfig, Feign.Builder builder) {
327+
Map<String, Collection<String>> defaultRequestHeaders = defaultConfig != null
328+
? defaultConfig.getDefaultRequestHeaders() : new HashMap<>();
329+
if (clientConfig != null) {
330+
defaultRequestHeaders.putAll(clientConfig.getDefaultRequestHeaders());
331+
}
332+
if (!defaultRequestHeaders.isEmpty()) {
333+
addDefaultRequestHeaders(defaultRequestHeaders, builder);
334+
}
335+
336+
Map<String, Collection<String>> defaultQueryParameters = defaultConfig != null
337+
? defaultConfig.getDefaultQueryParameters() : new HashMap<>();
338+
if (clientConfig != null) {
339+
defaultQueryParameters.putAll(clientConfig.getDefaultQueryParameters());
340+
}
341+
if (!defaultQueryParameters.isEmpty()) {
342+
addDefaultQueryParams(defaultQueryParameters, builder);
336343
}
344+
337345
}
338346

339-
private void addDefaultRequestHeaders(FeignClientProperties.FeignClientConfiguration config,
347+
private void addDefaultQueryParams(Map<String, Collection<String>> defaultQueryParameters, Feign.Builder builder) {
348+
builder.requestInterceptor(requestTemplate -> {
349+
Map<String, Collection<String>> queries = requestTemplate.queries();
350+
defaultQueryParameters.keySet().forEach(key -> {
351+
if (!queries.containsKey(key)) {
352+
requestTemplate.query(key, defaultQueryParameters.get(key));
353+
}
354+
});
355+
});
356+
}
357+
358+
private void addDefaultRequestHeaders(Map<String, Collection<String>> defaultRequestHeaders,
340359
Feign.Builder builder) {
341-
Map<String, Collection<String>> defaultRequestHeaders = config.getDefaultRequestHeaders();
342-
if (Objects.nonNull(defaultRequestHeaders)) {
343-
builder.requestInterceptor(requestTemplate -> {
344-
Map<String, Collection<String>> headers = requestTemplate.headers();
345-
defaultRequestHeaders.keySet().forEach(key -> {
346-
if (!headers.containsKey(key)) {
347-
requestTemplate.header(key, defaultRequestHeaders.get(key));
348-
}
349-
});
360+
builder.requestInterceptor(requestTemplate -> {
361+
Map<String, Collection<String>> headers = requestTemplate.headers();
362+
defaultRequestHeaders.keySet().forEach(key -> {
363+
if (!headers.containsKey(key)) {
364+
requestTemplate.header(key, defaultRequestHeaders.get(key));
365+
}
350366
});
351-
}
367+
});
352368
}
353369

354370
private <T> T getOrInstantiate(Class<T> tClass) {

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2022 the original author or authors.
2+
* Copyright 2013-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -130,9 +130,9 @@ public static class FeignClientConfiguration {
130130

131131
private Class<ResponseInterceptor> responseInterceptor;
132132

133-
private Map<String, Collection<String>> defaultRequestHeaders;
133+
private Map<String, Collection<String>> defaultRequestHeaders = new HashMap<>();
134134

135-
private Map<String, Collection<String>> defaultQueryParameters;
135+
private Map<String, Collection<String>> defaultQueryParameters = new HashMap<>();
136136

137137
private Boolean dismiss404;
138138

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021-2022 the original author or authors.
2+
* Copyright 2021-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -62,8 +62,8 @@ void shouldDefaultToValuesWhenFieldsNotSet() {
6262
assertThat(config.getErrorDecoder()).isNull();
6363
assertThat(config.getRequestInterceptors()).isNull();
6464
assertThat(config.getResponseInterceptor()).isNull();
65-
assertThat(config.getDefaultRequestHeaders()).isNull();
66-
assertThat(config.getDefaultQueryParameters()).isNull();
65+
assertThat(config.getDefaultRequestHeaders()).isEmpty();
66+
assertThat(config.getDefaultQueryParameters()).isEmpty();
6767
assertThat(config.getDismiss404()).isNull();
6868
assertThat(config.getDecoder()).isNull();
6969
assertThat(config.getEncoder()).isNull();

0 commit comments

Comments
 (0)