diff --git a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc index 6e59dae4..579e5067 100644 --- a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc +++ b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc @@ -549,7 +549,7 @@ public interface DemoTemplate { ---- === Feign `CollectionFormat` support -We support `feign.CollectionFormat` by providing the `@CollectionFormat` annotation. You can annotate a Feign client method with it by passing the desired `feign.CollectionFormat` as annotation value. +We support `feign.CollectionFormat` by providing the `@CollectionFormat` annotation.You can annotate a Feign client method with it by passing the desired `feign.CollectionFormat` as annotation value. In the following example, the `CSV` format is used instead of the default `EXPLODED` to process the method. @@ -568,7 +568,7 @@ In the following example, the `CSV` format is used instead of the default `EXPLO TIP: Set the `CSV` format while sending `Pageable` as a query parameter in order for it to be encoded correctly. === Reactive Support -As the https://github.com/OpenFeign/feign[OpenFeign project] does not currently support reactive clients, such as https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.html[Spring WebClient], neither does Spring Cloud OpenFeign. We will add support for it here as soon as it becomes available in the core project. +As the https://github.com/OpenFeign/feign[OpenFeign project] does not currently support reactive clients, such as https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.html[Spring WebClient], neither does Spring Cloud OpenFeign.We will add support for it here as soon as it becomes available in the core project. Until that is done, we recommend using https://github.com/Playtika/feign-reactive[feign-reactive] for Spring WebClient support. @@ -583,6 +583,15 @@ 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 7e2c0752..51ed1de1 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.RequestInterceptor; @@ -55,6 +56,8 @@ import org.springframework.cloud.commons.httpclient.OkHttpClientFactory; import org.springframework.cloud.openfeign.security.OAuth2FeignRequestInterceptor; 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.Conditional; import org.springframework.context.annotation.Configuration; @@ -65,6 +68,8 @@ import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResour /** * @author Spencer Gibb * @author Julien Roy + * @author Grzegorz Poznachowski + * @author Nikita Konev */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Feign.class) @@ -89,6 +94,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) @Conditional(FeignCircuitBreakerDisabledConditions.class) protected static class DefaultFeignTargeterConfiguration { 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 9b75aefa..7685fd29 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 feign.Contract; import feign.Feign; import feign.Logger; @@ -44,10 +43,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; @@ -142,18 +139,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 e2951520..656c06ba 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 @@ -31,7 +31,6 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; 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; @@ -56,7 +55,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen * @author Charlie Mordant. */ @SpringBootTest(classes = FeignPageableEncodingTests.Application.class, webEnvironment = RANDOM_PORT, - value = { "feign.compression.request.enabled=true", "ribbon.OkToRetryOnAllOperations=false" }) + value = { "feign.compression.request.enabled=true", "feign.autoconfiguration.jackson.enabled=true" }) @RunWith(SpringJUnit4ClassRunner.class) public class FeignPageableEncodingTests { @@ -92,7 +91,7 @@ public class FeignPageableEncodingTests { @SpringBootApplication(scanBasePackages = "org.springframework.cloud.openfeign.encoding.app", exclude = { RepositoryRestMvcAutoConfiguration.class }) @EnableSpringDataWebSupport - @Import({ NoSecurityConfiguration.class, FeignClientsConfiguration.class }) + @Import({ NoSecurityConfiguration.class }) public static class Application { }