diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java index 82006d37b255..69279499fe73 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java @@ -23,6 +23,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; @@ -136,12 +137,19 @@ public WebTestClient.Builder filters(Consumer> filt return this; } + @Override + public WebTestClient.Builder codecs(Consumer configurer) { + this.webClientBuilder.codecs(configurer); + return this; + } + @Override public WebTestClient.Builder exchangeStrategies(ExchangeStrategies strategies) { this.webClientBuilder.exchangeStrategies(strategies); return this; } + @SuppressWarnings("deprecation") @Override public WebTestClient.Builder exchangeStrategies(Consumer configurer) { this.webClientBuilder.exchangeStrategies(configurer); diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java index 814a3a9ebd09..1c772e50b404 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java @@ -37,6 +37,7 @@ import org.springframework.http.MediaType; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; @@ -442,14 +443,22 @@ interface Builder { */ Builder filters(Consumer> filtersConsumer); + /** + * Configure the codecs for the {@code WebClient} in the + * {@link #exchangeStrategies(ExchangeStrategies) underlying} + * {@code ExchangeStrategies}. + * @param configurer the configurer to apply + * @since 5.1.13 + */ + Builder codecs(Consumer configurer); + /** * Configure the {@link ExchangeStrategies} to use. - *

Note that in a scenario where the builder is configured by - * multiple parties, it is preferable to use - * {@link #exchangeStrategies(Consumer)} in order to customize the same - * {@code ExchangeStrategies}. This method here sets the strategies that - * everyone else then can customize. - *

By default this is {@link ExchangeStrategies#withDefaults()}. + *

For most cases, prefer using {@link #codecs(Consumer)} which allows + * customizing the codecs in the {@code ExchangeStrategies} rather than + * replace them. That ensures multiple parties can contribute to codecs + * configuration. + *

By default this is set to {@link ExchangeStrategies#withDefaults()}. * @param strategies the strategies to use */ Builder exchangeStrategies(ExchangeStrategies strategies); @@ -459,8 +468,9 @@ interface Builder { * {@link #exchangeStrategies(ExchangeStrategies)}. This method is * designed for use in scenarios where multiple parties wish to update * the {@code ExchangeStrategies}. - * @since 5.1.12 + * @deprecated as of 5.1.13 in favor of {@link #codecs(Consumer)} */ + @Deprecated Builder exchangeStrategies(Consumer configurer); /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java index 44c3164b701b..c255c439d326 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java @@ -27,6 +27,7 @@ import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.JettyClientHttpConnector; import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -206,12 +207,22 @@ public WebClient.Builder clientConnector(ClientHttpConnector connector) { return this; } + @Override + public WebClient.Builder codecs(Consumer configurer) { + if (this.strategiesConfigurers == null) { + this.strategiesConfigurers = new ArrayList<>(4); + } + this.strategiesConfigurers.add(builder -> builder.codecs(configurer)); + return this; + } + @Override public WebClient.Builder exchangeStrategies(ExchangeStrategies strategies) { this.strategies = strategies; return this; } + @SuppressWarnings("deprecation") @Override public WebClient.Builder exchangeStrategies(Consumer configurer) { if (this.strategiesConfigurers == null) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java index 8bafb691fe7d..02d0f07bf3f0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/WebClient.java @@ -39,6 +39,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; @@ -290,14 +291,22 @@ interface Builder { */ Builder clientConnector(ClientHttpConnector connector); + /** + * Configure the codecs for the {@code WebClient} in the + * {@link #exchangeStrategies(ExchangeStrategies) underlying} + * {@code ExchangeStrategies}. + * @param configurer the configurer to apply + * @since 5.1.13 + */ + Builder codecs(Consumer configurer); + /** * Configure the {@link ExchangeStrategies} to use. - *

Note that in a scenario where the builder is configured by - * multiple parties, it is preferable to use - * {@link #exchangeStrategies(Consumer)} in order to customize the same - * {@code ExchangeStrategies}. This method here sets the strategies that - * everyone else then can customize. - *

By default this is {@link ExchangeStrategies#withDefaults()}. + *

For most cases, prefer using {@link #codecs(Consumer)} which allows + * customizing the codecs in the {@code ExchangeStrategies} rather than + * replace them. That ensures multiple parties can contribute to codecs + * configuration. + *

By default this is set to {@link ExchangeStrategies#withDefaults()}. * @param strategies the strategies to use */ Builder exchangeStrategies(ExchangeStrategies strategies); @@ -307,15 +316,17 @@ interface Builder { * {@link #exchangeStrategies(ExchangeStrategies)}. This method is * designed for use in scenarios where multiple parties wish to update * the {@code ExchangeStrategies}. - * @since 5.1.12 + * @deprecated as of 5.1.13 in favor of {@link #codecs(Consumer)} */ + @Deprecated Builder exchangeStrategies(Consumer configurer); /** * Provide an {@link ExchangeFunction} pre-configured with * {@link ClientHttpConnector} and {@link ExchangeStrategies}. *

This is an alternative to, and effectively overrides - * {@link #clientConnector}, and {@link #exchangeStrategies}. + * {@link #clientConnector}, and + * {@link #exchangeStrategies(ExchangeStrategies)}. * @param exchangeFunction the exchange function to use */ Builder exchangeFunction(ExchangeFunction exchangeFunction); diff --git a/src/docs/asciidoc/web/webflux.adoc b/src/docs/asciidoc/web/webflux.adoc index b0493abda2c8..704867efef20 100644 --- a/src/docs/asciidoc/web/webflux.adoc +++ b/src/docs/asciidoc/web/webflux.adoc @@ -979,31 +979,21 @@ The following example shows how to do so for client-side requests: [source,java,indent=0,subs="verbatim,quotes",role="primary"] .Java ---- - Consumer consumer = configurer -> { - CustomDecoder customDecoder = new CustomDecoder(); - configurer.customCodecs().decoder(customDecoder); - configurer.customCodecs().withDefaultCodecConfig(config -> - customDecoder.maxInMemorySize(config.maxInMemorySize()) - ); - } - WebClient webClient = WebClient.builder() - .exchangeStrategies(strategies -> strategies.codecs(consumer)) + .codecs(configurer -> { + CustomDecoder decoder = new CustomDecoder(); + configurer.customCodecs().registerWithDefaultConfig(decoder); + }) .build(); ---- [source,kotlin,indent=0,subs="verbatim,quotes",role="secondary"] .Kotlin ---- - val consumer: (ClientCodecConfigurer) -> Unit = { configurer -> - val customDecoder = CustomDecoder() - configurer.customCodecs().decoder(customDecoder) - configurer.customCodecs().withDefaultCodecConfig({ config -> - customDecoder.maxInMemorySize(config.maxInMemorySize()) - }) - } - val webClient = WebClient.builder() - .exchangeStrategies({ strategies -> strategies.codecs(consumer) }) + .codecs({ configurer -> + val decoder = CustomDecoder() + configurer.customCodecs().registerWithDefaultConfig(decoder) + }) .build() ----