diff --git a/spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java b/spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java index 807541aa327..8ccb13c3bb1 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java +++ b/spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java @@ -229,7 +229,8 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { } void addMessageConvertersListConfigurer(Consumer>> configurer) { - this.convertersListConfigurer = (this.convertersListConfigurer != null) ? this.convertersListConfigurer.andThen(this.convertersListConfigurer) : configurer; + this.convertersListConfigurer = (this.convertersListConfigurer != null) ? + this.convertersListConfigurer.andThen(this.convertersListConfigurer) : configurer; } List> getBaseConverters() { @@ -475,13 +476,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { if (this.registerDefaults) { allConverters.addAll(this.getCoreConverters()); } - if (this.configurer != null) { - allConverters.forEach(this.configurer); - } if (this.convertersListConfigurer != null) { this.convertersListConfigurer.accept(allConverters); } - + if (this.configurer != null) { + allConverters.forEach(this.configurer); + } return new DefaultHttpMessageConverters(allConverters); } } @@ -586,13 +586,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { if (this.registerDefaults) { allConverters.addAll(this.getCoreConverters()); } - if (this.configurer != null) { - allConverters.forEach(this.configurer); - } if (this.convertersListConfigurer != null) { this.convertersListConfigurer.accept(allConverters); } - + if (this.configurer != null) { + allConverters.forEach(this.configurer); + } return new DefaultHttpMessageConverters(allConverters); } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java index 68a6a859cbf..254bc359216 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java @@ -167,18 +167,21 @@ public interface HttpMessageConverters extends Iterable> */ T addCustomConverter(HttpMessageConverter customConverter); + /** + * Add a consumer for mutating the list of selected message converters. + *

This operation happens before converters are + * {@link #configureMessageConverters(Consumer) configured individually}.

+ * @param configurer the configurer to use + * @since 7.0.3 + */ + T configureMessageConvertersList(Consumer>> configurer); + /** * Add a consumer for configuring the selected message converters. * @param configurer the configurer to use */ T configureMessageConverters(Consumer> configurer); - /** - * Add a consumer for configuring the message converters list just before it's returned. - * @param configurer the configurer to use - */ - T configureMessageConvertersList(Consumer>> configurer); - /** * Build and return the {@link HttpMessageConverters} instance configured by this builder. */ diff --git a/spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java b/spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java index ba20cd3b779..35a58330df2 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java @@ -17,11 +17,9 @@ package org.springframework.http.converter; import java.io.IOException; -import java.util.Comparator; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import org.assertj.core.util.Lists; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -214,24 +212,14 @@ class DefaultHttpMessageConvertersTests { } @Test - void shouldConfigureConverterOrder() { + void shouldAppendCustomConverterToList() { var customConverter = new CustomHttpMessageConverter(); - var converted = HttpMessageConverters.forClient() - .addCustomConverter(customConverter) - .configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? 1 : -1))).build(); - - var messageConvertersBack = Lists.newArrayList(converted); - assertThat(messageConvertersBack.size()).isGreaterThan(1); - assertThat(messageConvertersBack.get(messageConvertersBack.size() - 1).getClass()).isEqualTo(CustomHttpMessageConverter.class); - - var convertedFront = HttpMessageConverters.forClient() - .addCustomConverter(customConverter) - .configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? -1 : 1))).build(); - - var messageConvertersFront = Lists.newArrayList(convertedFront); - assertThat(messageConvertersFront.get(0).getClass()).isEqualTo(CustomHttpMessageConverter.class); - assertThat(messageConvertersFront.size()).isGreaterThan(1); + var messageConverters = HttpMessageConverters.forClient() + .registerDefaults() + .configureMessageConvertersList(converters -> converters.add(customConverter)) + .build(); + assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class); } } @@ -344,24 +332,14 @@ class DefaultHttpMessageConvertersTests { } @Test - void shouldConfigureConverterOrder() { + void shouldAppendCustomConverterToList() { var customConverter = new CustomHttpMessageConverter(); - var converted = HttpMessageConverters.forServer() - .addCustomConverter(customConverter) - .configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? 1 : -1))).build(); - - var messageConvertersBack = Lists.newArrayList(converted); - assertThat(messageConvertersBack.size()).isGreaterThan(1); - assertThat(messageConvertersBack.get(messageConvertersBack.size() - 1).getClass()).isEqualTo(CustomHttpMessageConverter.class); - - var convertedFront = HttpMessageConverters.forServer() - .addCustomConverter(customConverter) - .configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? -1 : 1))).build(); - - var messageConvertersFront = Lists.newArrayList(convertedFront); - assertThat(messageConvertersFront.size()).isGreaterThan(1); - assertThat(messageConvertersFront.get(0).getClass()).isEqualTo(CustomHttpMessageConverter.class); + var messageConverters = HttpMessageConverters.forServer() + .registerDefaults() + .configureMessageConvertersList(converters -> converters.add(customConverter)) + .build(); + assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class); } }