From 6b29a1f7df81c9c5266f616993350494a10efea9 Mon Sep 17 00:00:00 2001 From: Nikita Konev <3160384+nkonev@users.noreply.github.com> Date: Tue, 26 Jan 2021 11:23:51 +0300 Subject: [PATCH] Move Spring Data Jackson Modules from FeignClientsConfiguration to FeignAutoConfiguration - Fix https://github.com/spring-cloud/spring-cloud-openfeign/issues/205 (#430) --- .../main/asciidoc/spring-cloud-openfeign.adoc | 8 +++++++ .../openfeign/FeignAutoConfiguration.java | 21 +++++++++++++++++++ .../openfeign/FeignClientsConfiguration.java | 15 ------------- .../encoding/FeignPageableEncodingTests.java | 4 ++-- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc index c0367d00..659ede2e 100644 --- a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc +++ b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc @@ -704,6 +704,14 @@ To work around this problem you can use an `ObjectProvider` when autowiring your ObjectProvider testFeginClient; ---- +=== Spring Data Support +You may consider enabling Jackson Modules for the support `org.springframework.data.domain.Page` and `org.springframework.data.domain.Sort` decoding. + +[source,java] +---- +feign.autoconfiguration.jackson.enabled=true +---- + == Configuration properties To see the list of all Sleuth related configuration properties please check link:appendix.html[the Appendix page]. 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 875b7f1a..d3dcdf9b 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 @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import javax.annotation.PreDestroy; +import com.fasterxml.jackson.databind.Module; import feign.Client; import feign.Feign; import feign.httpclient.ApacheHttpClient; @@ -54,6 +55,8 @@ import org.springframework.cloud.commons.httpclient.OkHttpClientConnectionPoolFa import org.springframework.cloud.commons.httpclient.OkHttpClientFactory; import org.springframework.cloud.openfeign.support.DefaultGzipDecoderConfiguration; import org.springframework.cloud.openfeign.support.FeignHttpClientProperties; +import org.springframework.cloud.openfeign.support.PageJacksonModule; +import org.springframework.cloud.openfeign.support.SortJacksonModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -61,6 +64,8 @@ import org.springframework.context.annotation.Import; /** * @author Spencer Gibb * @author Julien Roy + * @author Grzegorz Poznachowski + * @author Nikita Konev */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Feign.class) @@ -86,6 +91,22 @@ public class FeignAutoConfiguration { return context; } + @Bean + @ConditionalOnMissingBean(PageJacksonModule.class) + @ConditionalOnClass(name = "org.springframework.data.domain.Page") + @ConditionalOnProperty(value = "feign.autoconfiguration.jackson.enabled", havingValue = "true") + public Module pageJacksonModule() { + return new PageJacksonModule(); + } + + @Bean + @ConditionalOnMissingBean(SortJacksonModule.class) + @ConditionalOnClass(name = "org.springframework.data.domain.Sort") + @ConditionalOnProperty(value = "feign.autoconfiguration.jackson.enabled", havingValue = "true") + public Module sortModule() { + return new SortJacksonModule(); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnMissingClass({ "feign.hystrix.HystrixFeign", "org.springframework.cloud.client.circuitbreaker.CircuitBreaker" }) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsConfiguration.java index 1eb6c663..4d6822f6 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsConfiguration.java @@ -19,7 +19,6 @@ package org.springframework.cloud.openfeign; import java.util.ArrayList; import java.util.List; -import com.fasterxml.jackson.databind.Module; import com.netflix.hystrix.HystrixCommand; import feign.Contract; import feign.Feign; @@ -46,10 +45,8 @@ import org.springframework.cloud.client.circuitbreaker.CircuitBreaker; import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; import org.springframework.cloud.openfeign.clientconfig.FeignClientConfigurer; import org.springframework.cloud.openfeign.support.AbstractFormWriter; -import org.springframework.cloud.openfeign.support.PageJacksonModule; import org.springframework.cloud.openfeign.support.PageableSpringEncoder; import org.springframework.cloud.openfeign.support.ResponseEntityDecoder; -import org.springframework.cloud.openfeign.support.SortJacksonModule; import org.springframework.cloud.openfeign.support.SpringDecoder; import org.springframework.cloud.openfeign.support.SpringEncoder; import org.springframework.cloud.openfeign.support.SpringMvcContract; @@ -158,18 +155,6 @@ public class FeignClientsConfiguration { return new DefaultFeignLoggerFactory(this.logger); } - @Bean - @ConditionalOnClass(name = "org.springframework.data.domain.Page") - public Module pageJacksonModule() { - return new PageJacksonModule(); - } - - @Bean - @ConditionalOnClass(name = "org.springframework.data.domain.Page") - public Module sortModule() { - return new SortJacksonModule(); - } - @Bean @ConditionalOnMissingBean(FeignClientConfigurer.class) public FeignClientConfigurer feignClientConfigurer() { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignPageableEncodingTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignPageableEncodingTests.java index c909eede..7e7a2b3b 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignPageableEncodingTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignPageableEncodingTests.java @@ -32,7 +32,6 @@ import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoCon import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClientsConfiguration; import org.springframework.cloud.openfeign.encoding.app.client.InvoiceClient; import org.springframework.cloud.openfeign.encoding.app.domain.Invoice; import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; @@ -59,6 +58,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen @SpringBootTest(classes = FeignPageableEncodingTests.Application.class, webEnvironment = RANDOM_PORT, value = { "feign.compression.request.enabled=true", + "feign.autoconfiguration.jackson.enabled=true", "hystrix.command.default.execution.isolation.strategy=SEMAPHORE", "ribbon.OkToRetryOnAllOperations=false" }) @RunWith(SpringJUnit4ClassRunner.class) @@ -99,7 +99,7 @@ public class FeignPageableEncodingTests { scanBasePackages = "org.springframework.cloud.openfeign.encoding.app", exclude = { RepositoryRestMvcAutoConfiguration.class }) @EnableSpringDataWebSupport - @Import({ NoSecurityConfiguration.class, FeignClientsConfiguration.class }) + @Import({ NoSecurityConfiguration.class }) public static class Application { }