From 2b07f213c87883a09b731d2dc7200b2ca2e7b07b Mon Sep 17 00:00:00 2001 From: Olga MaciaszekSharma Date: Fri, 15 Dec 2023 16:55:45 +0100 Subject: [PATCH] Override default request headers and query param from default client config with specific client config. Fixes gh-715. --- .../openfeign/FeignClientFactoryBean.java | 70 ++++++++++++------- .../openfeign/FeignClientProperties.java | 6 +- .../FeignClientConfigurationTests.java | 6 +- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java index bb5a770f..5fc73f80 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java @@ -18,6 +18,7 @@ package org.springframework.cloud.openfeign; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -72,7 +73,7 @@ import org.springframework.util.StringUtils; * @author Hyeonmin Park * @author Felix Dittrich * @author Dominique Villard - * @athor Can Bezmen + * @author Can Bezmen */ public class FeignClientFactoryBean implements FactoryBean, InitializingBean, ApplicationContextAware, BeanFactoryAware { @@ -178,6 +179,8 @@ public class FeignClientFactoryBean configureUsingProperties(properties.getConfig().get(contextId), builder); configureUsingConfiguration(context, builder); } + configureDefaultRequestElements(properties.getConfig().get(properties.getDefaultConfig()), + properties.getConfig().get(contextId), builder); } else { configureUsingConfiguration(context, builder); @@ -298,9 +301,6 @@ public class FeignClientFactoryBean builder.encoder(getOrInstantiate(config.getEncoder())); } - addDefaultRequestHeaders(config, builder); - addDefaultQueryParams(config, builder); - if (Objects.nonNull(config.getDecoder())) { builder.decoder(getOrInstantiate(config.getDecoder())); } @@ -322,33 +322,49 @@ public class FeignClientFactoryBean } } - private void addDefaultQueryParams(FeignClientProperties.FeignClientConfiguration config, Feign.Builder builder) { - Map> defaultQueryParameters = config.getDefaultQueryParameters(); - if (Objects.nonNull(defaultQueryParameters)) { - builder.requestInterceptor(requestTemplate -> { - Map> queries = requestTemplate.queries(); - defaultQueryParameters.keySet().forEach(key -> { - if (!queries.containsKey(key)) { - requestTemplate.query(key, defaultQueryParameters.get(key)); - } - }); - }); + protected void configureDefaultRequestElements(FeignClientProperties.FeignClientConfiguration defaultConfig, + FeignClientProperties.FeignClientConfiguration clientConfig, Feign.Builder builder) { + Map> defaultRequestHeaders = defaultConfig != null + ? defaultConfig.getDefaultRequestHeaders() : new HashMap<>(); + if (clientConfig != null) { + defaultRequestHeaders.putAll(clientConfig.getDefaultRequestHeaders()); } + if (!defaultRequestHeaders.isEmpty()) { + addDefaultRequestHeaders(defaultRequestHeaders, builder); + } + + Map> defaultQueryParameters = defaultConfig != null + ? defaultConfig.getDefaultQueryParameters() : new HashMap<>(); + if (clientConfig != null) { + defaultQueryParameters.putAll(clientConfig.getDefaultQueryParameters()); + } + if (!defaultQueryParameters.isEmpty()) { + addDefaultQueryParams(defaultQueryParameters, builder); + } + } - private void addDefaultRequestHeaders(FeignClientProperties.FeignClientConfiguration config, - Feign.Builder builder) { - Map> defaultRequestHeaders = config.getDefaultRequestHeaders(); - if (Objects.nonNull(defaultRequestHeaders)) { - builder.requestInterceptor(requestTemplate -> { - Map> headers = requestTemplate.headers(); - defaultRequestHeaders.keySet().forEach(key -> { - if (!headers.containsKey(key)) { - requestTemplate.header(key, defaultRequestHeaders.get(key)); - } - }); + private void addDefaultQueryParams(Map> defaultQueryParameters, Feign.Builder builder) { + builder.requestInterceptor(requestTemplate -> { + Map> queries = requestTemplate.queries(); + defaultQueryParameters.keySet().forEach(key -> { + if (!queries.containsKey(key)) { + requestTemplate.query(key, defaultQueryParameters.get(key)); + } }); - } + }); + } + + private void addDefaultRequestHeaders(Map> defaultRequestHeaders, + Feign.Builder builder) { + builder.requestInterceptor(requestTemplate -> { + Map> headers = requestTemplate.headers(); + defaultRequestHeaders.keySet().forEach(key -> { + if (!headers.containsKey(key)) { + requestTemplate.header(key, defaultRequestHeaders.get(key)); + } + }); + }); } private T getOrInstantiate(Class tClass) { diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java index b826aa21..bec1b653 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2022 the original author or authors. + * Copyright 2013-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -130,9 +130,9 @@ public class FeignClientProperties { private Class responseInterceptor; - private Map> defaultRequestHeaders; + private Map> defaultRequestHeaders = new HashMap<>(); - private Map> defaultQueryParameters; + private Map> defaultQueryParameters = new HashMap<>(); private Boolean dismiss404; diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java index 5e9875a9..004fdd39 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 the original author or authors. + * Copyright 2021-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,8 +62,8 @@ class FeignClientConfigurationTests { assertThat(config.getErrorDecoder()).isNull(); assertThat(config.getRequestInterceptors()).isNull(); assertThat(config.getResponseInterceptor()).isNull(); - assertThat(config.getDefaultRequestHeaders()).isNull(); - assertThat(config.getDefaultQueryParameters()).isNull(); + assertThat(config.getDefaultRequestHeaders()).isEmpty(); + assertThat(config.getDefaultQueryParameters()).isEmpty(); assertThat(config.getDismiss404()).isNull(); assertThat(config.getDecoder()).isNull(); assertThat(config.getEncoder()).isNull();