From f4ca971253fd9b09edabde6e72217ad246663e69 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Mon, 9 Nov 2020 10:38:56 +0000 Subject: [PATCH 1/5] Update SNAPSHOT to 2.2.6.RELEASE --- docs/pom.xml | 2 +- pom.xml | 6 +++--- spring-cloud-openfeign-core/pom.xml | 2 +- .../cloud/openfeign/FeignClientsRegistrar.java | 3 +-- .../openfeign/FeignClientsRegistrarTests.java | 14 ++++++++------ .../feignclientsregistrar/TopLevelClient.java | 1 + .../feignclientsregistrar/sub/SubLevelClient.java | 1 + spring-cloud-openfeign-dependencies/pom.xml | 4 ++-- spring-cloud-starter-openfeign/pom.xml | 2 +- 9 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 04a53db1..b646c85a 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE spring-cloud-openfeign-docs pom diff --git a/pom.xml b/pom.xml index 81842c9f..7998ab70 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE pom Spring Cloud OpenFeign Spring Cloud OpenFeign @@ -26,8 +26,8 @@ ${basedir} 2.11.3 - 2.2.6.BUILD-SNAPSHOT - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE + 2.2.6.RELEASE 2.10 diff --git a/spring-cloud-openfeign-core/pom.xml b/spring-cloud-openfeign-core/pom.xml index 3f4a1dd8..857fb4b8 100644 --- a/spring-cloud-openfeign-core/pom.xml +++ b/spring-cloud-openfeign-core/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE .. spring-cloud-openfeign-core diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java index dbb04fef..e340e420 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java @@ -192,8 +192,7 @@ class FeignClientsRegistrar "@FeignClient can only be specified on an interface"); Map attributes = annotationMetadata - .getAnnotationAttributes( - FeignClient.class.getCanonicalName()); + .getAnnotationAttributes(FeignClient.class.getCanonicalName()); String name = getClientName(attributes); registerClientConfiguration(registry, name, diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java index b9c924dc..b25f5a06 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java @@ -96,11 +96,12 @@ public class FeignClientsRegistrarTests { @Test public void shouldPassSubLevelFeignClient() { AnnotationConfigApplicationContext config = new AnnotationConfigApplicationContext(); - ((DefaultListableBeanFactory) config.getBeanFactory()).setAllowBeanDefinitionOverriding(false); + ((DefaultListableBeanFactory) config.getBeanFactory()) + .setAllowBeanDefinitionOverriding(false); config.register(TopLevelSubLevelTestConfig.class); - assertThatCode(() -> config.refresh()) - .as("Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") - .doesNotThrowAnyException(); + assertThatCode(() -> config.refresh()).as( + "Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") + .doesNotThrowAnyException(); } @@ -138,10 +139,11 @@ public class FeignClientsRegistrarTests { } @EnableFeignClients(clients = { - org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, - org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class}) + org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, + org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class }) @EnableAutoConfiguration(exclude = TestAutoConfiguration.class) protected static class TopLevelSubLevelTestConfig { + } } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java index 2128bce4..d52cc4a1 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java @@ -24,4 +24,5 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("top-level") public interface TopLevelClient { + } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java index 84d01aea..29126482 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java @@ -24,4 +24,5 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("sub-level") public interface SubLevelClient { + } diff --git a/spring-cloud-openfeign-dependencies/pom.xml b/spring-cloud-openfeign-dependencies/pom.xml index aff93012..ab0c56f7 100644 --- a/spring-cloud-openfeign-dependencies/pom.xml +++ b/spring-cloud-openfeign-dependencies/pom.xml @@ -6,11 +6,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.3.2.BUILD-SNAPSHOT + 2.3.1.RELEASE spring-cloud-openfeign-dependencies - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE pom spring-cloud-openfeign-dependencies Spring Cloud OpenFeign Dependencies diff --git a/spring-cloud-starter-openfeign/pom.xml b/spring-cloud-starter-openfeign/pom.xml index 83e778f0..0b1ef5e2 100644 --- a/spring-cloud-starter-openfeign/pom.xml +++ b/spring-cloud-starter-openfeign/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.6.RELEASE .. spring-cloud-starter-openfeign From e31defb2dd73bd657f441d13818a58d732ae5d2c Mon Sep 17 00:00:00 2001 From: buildmaster Date: Mon, 9 Nov 2020 10:40:37 +0000 Subject: [PATCH 2/5] Going back to snapshots --- docs/pom.xml | 2 +- pom.xml | 6 +++--- spring-cloud-openfeign-core/pom.xml | 2 +- .../cloud/openfeign/FeignClientsRegistrar.java | 3 ++- .../openfeign/FeignClientsRegistrarTests.java | 14 ++++++-------- .../feignclientsregistrar/TopLevelClient.java | 1 - .../feignclientsregistrar/sub/SubLevelClient.java | 1 - spring-cloud-openfeign-dependencies/pom.xml | 4 ++-- spring-cloud-starter-openfeign/pom.xml | 2 +- 9 files changed, 16 insertions(+), 19 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index b646c85a..04a53db1 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT spring-cloud-openfeign-docs pom diff --git a/pom.xml b/pom.xml index 7998ab70..81842c9f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-openfeign - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT pom Spring Cloud OpenFeign Spring Cloud OpenFeign @@ -26,8 +26,8 @@ ${basedir} 2.11.3 - 2.2.6.RELEASE - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT + 2.2.6.BUILD-SNAPSHOT 2.10 diff --git a/spring-cloud-openfeign-core/pom.xml b/spring-cloud-openfeign-core/pom.xml index 857fb4b8..3f4a1dd8 100644 --- a/spring-cloud-openfeign-core/pom.xml +++ b/spring-cloud-openfeign-core/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT .. spring-cloud-openfeign-core diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java index e340e420..dbb04fef 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java @@ -192,7 +192,8 @@ class FeignClientsRegistrar "@FeignClient can only be specified on an interface"); Map attributes = annotationMetadata - .getAnnotationAttributes(FeignClient.class.getCanonicalName()); + .getAnnotationAttributes( + FeignClient.class.getCanonicalName()); String name = getClientName(attributes); registerClientConfiguration(registry, name, diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java index b25f5a06..b9c924dc 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java @@ -96,12 +96,11 @@ public class FeignClientsRegistrarTests { @Test public void shouldPassSubLevelFeignClient() { AnnotationConfigApplicationContext config = new AnnotationConfigApplicationContext(); - ((DefaultListableBeanFactory) config.getBeanFactory()) - .setAllowBeanDefinitionOverriding(false); + ((DefaultListableBeanFactory) config.getBeanFactory()).setAllowBeanDefinitionOverriding(false); config.register(TopLevelSubLevelTestConfig.class); - assertThatCode(() -> config.refresh()).as( - "Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") - .doesNotThrowAnyException(); + assertThatCode(() -> config.refresh()) + .as("Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") + .doesNotThrowAnyException(); } @@ -139,11 +138,10 @@ public class FeignClientsRegistrarTests { } @EnableFeignClients(clients = { - org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, - org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class }) + org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, + org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class}) @EnableAutoConfiguration(exclude = TestAutoConfiguration.class) protected static class TopLevelSubLevelTestConfig { - } } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java index d52cc4a1..2128bce4 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java @@ -24,5 +24,4 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("top-level") public interface TopLevelClient { - } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java index 29126482..84d01aea 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java @@ -24,5 +24,4 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("sub-level") public interface SubLevelClient { - } diff --git a/spring-cloud-openfeign-dependencies/pom.xml b/spring-cloud-openfeign-dependencies/pom.xml index ab0c56f7..aff93012 100644 --- a/spring-cloud-openfeign-dependencies/pom.xml +++ b/spring-cloud-openfeign-dependencies/pom.xml @@ -6,11 +6,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.3.1.RELEASE + 2.3.2.BUILD-SNAPSHOT spring-cloud-openfeign-dependencies - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT pom spring-cloud-openfeign-dependencies Spring Cloud OpenFeign Dependencies diff --git a/spring-cloud-starter-openfeign/pom.xml b/spring-cloud-starter-openfeign/pom.xml index 0b1ef5e2..83e778f0 100644 --- a/spring-cloud-starter-openfeign/pom.xml +++ b/spring-cloud-starter-openfeign/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.RELEASE + 2.2.6.BUILD-SNAPSHOT .. spring-cloud-starter-openfeign From 1b42820c3a645e908e95f53d913694f2188414ab Mon Sep 17 00:00:00 2001 From: buildmaster Date: Mon, 9 Nov 2020 10:40:38 +0000 Subject: [PATCH 3/5] Bumping versions to 2.2.7.BUILD-SNAPSHOT after release --- docs/pom.xml | 2 +- pom.xml | 6 +++--- spring-cloud-openfeign-core/pom.xml | 2 +- spring-cloud-openfeign-dependencies/pom.xml | 2 +- spring-cloud-starter-openfeign/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 04a53db1..2b898e00 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT spring-cloud-openfeign-docs pom diff --git a/pom.xml b/pom.xml index 81842c9f..3d71f240 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT pom Spring Cloud OpenFeign Spring Cloud OpenFeign @@ -26,8 +26,8 @@ ${basedir} 2.11.3 - 2.2.6.BUILD-SNAPSHOT - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT 2.10 diff --git a/spring-cloud-openfeign-core/pom.xml b/spring-cloud-openfeign-core/pom.xml index 3f4a1dd8..1667151b 100644 --- a/spring-cloud-openfeign-core/pom.xml +++ b/spring-cloud-openfeign-core/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT .. spring-cloud-openfeign-core diff --git a/spring-cloud-openfeign-dependencies/pom.xml b/spring-cloud-openfeign-dependencies/pom.xml index aff93012..f5cc521d 100644 --- a/spring-cloud-openfeign-dependencies/pom.xml +++ b/spring-cloud-openfeign-dependencies/pom.xml @@ -10,7 +10,7 @@ spring-cloud-openfeign-dependencies - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT pom spring-cloud-openfeign-dependencies Spring Cloud OpenFeign Dependencies diff --git a/spring-cloud-starter-openfeign/pom.xml b/spring-cloud-starter-openfeign/pom.xml index 83e778f0..c83ad3a3 100644 --- a/spring-cloud-starter-openfeign/pom.xml +++ b/spring-cloud-starter-openfeign/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-openfeign - 2.2.6.BUILD-SNAPSHOT + 2.2.7.BUILD-SNAPSHOT .. spring-cloud-starter-openfeign From a8bcda0b5b114125e61d4e0c8297416a76b49af0 Mon Sep 17 00:00:00 2001 From: matt62king Date: Wed, 15 Apr 2020 06:55:27 -0500 Subject: [PATCH 4/5] add customizer for feign builder (#289). Fixes gh-436. * add customizer for feign builder * support @Order for customizers * switch to annotation aware comparator for @Order support * remove intermediate instances * removed default feign builder customizer # Conflicts: # spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java --- .../openfeign/FeignBuilderCustomizer.java | 31 ++++ .../openfeign/FeignClientFactoryBean.java | 13 ++ .../openfeign/FeignClientsRegistrar.java | 3 +- .../FeignBuilderCustomizerTests.java | 160 ++++++++++++++++++ .../openfeign/FeignClientsRegistrarTests.java | 14 +- .../feignclientsregistrar/TopLevelClient.java | 1 + .../sub/SubLevelClient.java | 1 + 7 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignBuilderCustomizer.java create mode 100644 spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignBuilderCustomizerTests.java diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignBuilderCustomizer.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignBuilderCustomizer.java new file mode 100644 index 00000000..53a35f9a --- /dev/null +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignBuilderCustomizer.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2019 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.openfeign; + +import feign.Feign; + +/** + * Allows application to customize the Feign builder. + * + * @author Matt King + */ +@FunctionalInterface +public interface FeignBuilderCustomizer { + + void customize(Feign.Builder builder); + +} 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 1bb38cdf..7d729072 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 @@ -111,10 +111,23 @@ class FeignClientFactoryBean // @formatter:on configureFeign(context, builder); + applyBuildCustomizers(context, builder); return builder; } + private void applyBuildCustomizers(FeignContext context, Feign.Builder builder) { + Map customizerMap = context + .getInstances(contextId, FeignBuilderCustomizer.class); + + if (customizerMap != null) { + customizerMap.values().stream() + .sorted(AnnotationAwareOrderComparator.INSTANCE) + .forEach(feignBuilderCustomizer -> feignBuilderCustomizer + .customize(builder)); + } + } + protected void configureFeign(FeignContext context, Feign.Builder builder) { FeignClientProperties properties = applicationContext .getBean(FeignClientProperties.class); diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java index dbb04fef..e340e420 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java @@ -192,8 +192,7 @@ class FeignClientsRegistrar "@FeignClient can only be specified on an interface"); Map attributes = annotationMetadata - .getAnnotationAttributes( - FeignClient.class.getCanonicalName()); + .getAnnotationAttributes(FeignClient.class.getCanonicalName()); String name = getClientName(attributes); registerClientConfiguration(registry, name, diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignBuilderCustomizerTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignBuilderCustomizerTests.java new file mode 100644 index 00000000..d66d3423 --- /dev/null +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignBuilderCustomizerTests.java @@ -0,0 +1,160 @@ +/* + * Copyright 2013-2019 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.openfeign; + +import java.lang.reflect.Field; + +import feign.Feign; +import feign.Logger; +import org.junit.Test; + +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.annotation.Order; +import org.springframework.util.ReflectionUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Matt King + */ +public class FeignBuilderCustomizerTests { + + @Test + public void testBuilderCustomizer() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + FeignBuilderCustomizerTests.SampleConfiguration2.class); + + FeignClientFactoryBean clientFactoryBean = context + .getBean(FeignClientFactoryBean.class); + FeignContext feignContext = context.getBean(FeignContext.class); + + Feign.Builder builder = clientFactoryBean.feign(feignContext); + assertFeignBuilderField(builder, "logLevel", Logger.Level.HEADERS); + assertFeignBuilderField(builder, "decode404", true); + + context.close(); + } + + private void assertFeignBuilderField(Feign.Builder builder, String fieldName, + Object expectedValue) { + Field builderField = ReflectionUtils.findField(Feign.Builder.class, fieldName); + ReflectionUtils.makeAccessible(builderField); + + Object value = ReflectionUtils.getField(builderField, builder); + assertThat(value).as("Expected value for the field '" + fieldName + "':") + .isEqualTo(expectedValue); + } + + @Test + public void testBuildCustomizerOrdered() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + FeignBuilderCustomizerTests.SampleConfiguration3.class); + + FeignClientFactoryBean clientFactoryBean = context + .getBean(FeignClientFactoryBean.class); + FeignContext feignContext = context.getBean(FeignContext.class); + + Feign.Builder builder = clientFactoryBean.feign(feignContext); + assertFeignBuilderField(builder, "logLevel", Logger.Level.FULL); + assertFeignBuilderField(builder, "decode404", true); + + context.close(); + } + + private static FeignClientFactoryBean defaultFeignClientFactoryBean() { + FeignClientFactoryBean feignClientFactoryBean = new FeignClientFactoryBean(); + feignClientFactoryBean.setContextId("test"); + feignClientFactoryBean.setName("test"); + feignClientFactoryBean.setType(FeignClientFactoryTests.TestType.class); + feignClientFactoryBean.setPath(""); + feignClientFactoryBean.setUrl("http://some.absolute.url"); + return feignClientFactoryBean; + } + + @Configuration(proxyBeanMethods = false) + @Import(FeignClientsConfiguration.class) + protected static class SampleConfiguration2 { + + @Bean + FeignContext feignContext() { + return new FeignContext(); + } + + @Bean + FeignClientProperties feignClientProperties() { + return new FeignClientProperties(); + } + + @Bean + FeignBuilderCustomizer feignBuilderCustomizer() { + return builder -> builder.logLevel(Logger.Level.HEADERS); + } + + @Bean + FeignBuilderCustomizer feignBuilderCustomizer2() { + return Feign.Builder::decode404; + } + + @Bean + FeignClientFactoryBean feignClientFactoryBean() { + return defaultFeignClientFactoryBean(); + } + + } + + @Configuration(proxyBeanMethods = false) + @Import(FeignClientsConfiguration.class) + protected static class SampleConfiguration3 { + + @Bean + FeignContext feignContext() { + return new FeignContext(); + } + + @Bean + FeignClientProperties feignClientProperties() { + return new FeignClientProperties(); + } + + @Bean + @Order(1) + FeignBuilderCustomizer feignBuilderCustomizer() { + return builder -> builder.logLevel(Logger.Level.HEADERS); + } + + @Bean + @Order(2) + FeignBuilderCustomizer feignBuilderCustomizer1() { + return builder -> builder.logLevel(Logger.Level.FULL); + } + + @Bean + FeignBuilderCustomizer feignBuilderCustomizer2() { + return Feign.Builder::decode404; + } + + @Bean + FeignClientFactoryBean feignClientFactoryBean() { + return defaultFeignClientFactoryBean(); + } + + } + +} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java index b9c924dc..b25f5a06 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsRegistrarTests.java @@ -96,11 +96,12 @@ public class FeignClientsRegistrarTests { @Test public void shouldPassSubLevelFeignClient() { AnnotationConfigApplicationContext config = new AnnotationConfigApplicationContext(); - ((DefaultListableBeanFactory) config.getBeanFactory()).setAllowBeanDefinitionOverriding(false); + ((DefaultListableBeanFactory) config.getBeanFactory()) + .setAllowBeanDefinitionOverriding(false); config.register(TopLevelSubLevelTestConfig.class); - assertThatCode(() -> config.refresh()) - .as("Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") - .doesNotThrowAnyException(); + assertThatCode(() -> config.refresh()).as( + "Case https://github.com/spring-cloud/spring-cloud-openfeign/issues/331 should be solved") + .doesNotThrowAnyException(); } @@ -138,10 +139,11 @@ public class FeignClientsRegistrarTests { } @EnableFeignClients(clients = { - org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, - org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class}) + org.springframework.cloud.openfeign.feignclientsregistrar.TopLevelClient.class, + org.springframework.cloud.openfeign.feignclientsregistrar.sub.SubLevelClient.class }) @EnableAutoConfiguration(exclude = TestAutoConfiguration.class) protected static class TopLevelSubLevelTestConfig { + } } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java index 2128bce4..d52cc4a1 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/TopLevelClient.java @@ -24,4 +24,5 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("top-level") public interface TopLevelClient { + } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java index 84d01aea..29126482 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/feignclientsregistrar/sub/SubLevelClient.java @@ -24,4 +24,5 @@ import org.springframework.cloud.openfeign.FeignClient; @FeignClient("sub-level") public interface SubLevelClient { + } From 4d021fd3f83b3dea2fce403d60dfbf66d1d76ca9 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Mon, 30 Nov 2020 18:21:44 +0100 Subject: [PATCH 5/5] Do not throw exceptions from `@PreDestroy` methods. Fixes gh-435. --- .../cloud/openfeign/FeignAutoConfiguration.java | 16 ++++++++++++++-- .../HttpClientFeignConfiguration.java | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index 461012d8..4f17ac1c 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -16,6 +16,7 @@ package org.springframework.cloud.openfeign; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Timer; @@ -29,6 +30,8 @@ import feign.Feign; import feign.httpclient.ApacheHttpClient; import feign.okhttp.OkHttpClient; import okhttp3.ConnectionPool; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.RegistryBuilder; @@ -63,6 +66,8 @@ import org.springframework.context.annotation.Import; @Import(DefaultGzipDecoderConfiguration.class) public class FeignAutoConfiguration { + private static final Log LOG = LogFactory.getLog(FeignAutoConfiguration.class); + @Autowired(required = false) private List configurations = new ArrayList<>(); @@ -163,10 +168,17 @@ public class FeignAutoConfiguration { } @PreDestroy - public void destroy() throws Exception { + public void destroy() { this.connectionManagerTimer.cancel(); if (this.httpClient != null) { - this.httpClient.close(); + try { + this.httpClient.close(); + } + catch (IOException e) { + if (LOG.isErrorEnabled()) { + LOG.error("Could not correctly close httpClient."); + } + } } } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/clientconfig/HttpClientFeignConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/clientconfig/HttpClientFeignConfiguration.java index c5ae09fd..a3164469 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/clientconfig/HttpClientFeignConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/clientconfig/HttpClientFeignConfiguration.java @@ -16,11 +16,14 @@ package org.springframework.cloud.openfeign.clientconfig; +import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import javax.annotation.PreDestroy; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.HttpClientConnectionManager; @@ -48,6 +51,8 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnMissingBean(CloseableHttpClient.class) public class HttpClientFeignConfiguration { + private static final Log LOG = LogFactory.getLog(HttpClientFeignConfiguration.class); + private final Timer connectionManagerTimer = new Timer( "FeignApacheHttpClientConfiguration.connectionManagerTimer", true); @@ -113,10 +118,17 @@ public class HttpClientFeignConfiguration { } @PreDestroy - public void destroy() throws Exception { + public void destroy() { this.connectionManagerTimer.cancel(); if (this.httpClient != null) { - this.httpClient.close(); + try { + this.httpClient.close(); + } + catch (IOException e) { + if (LOG.isErrorEnabled()) { + LOG.error("Could not correctly close httpClient."); + } + } } }