Browse Source

Polishing contribution

Closes gh-36083
pull/36110/head
Brian Clozel 3 weeks ago
parent
commit
9ef4ceb047
  1. 17
      spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java
  2. 11
      spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java
  3. 46
      spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java

17
spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java

@ -229,7 +229,8 @@ class DefaultHttpMessageConverters implements HttpMessageConverters {
} }
void addMessageConvertersListConfigurer(Consumer<List<HttpMessageConverter<?>>> configurer) { void addMessageConvertersListConfigurer(Consumer<List<HttpMessageConverter<?>>> configurer) {
this.convertersListConfigurer = (this.convertersListConfigurer != null) ? this.convertersListConfigurer.andThen(this.convertersListConfigurer) : configurer; this.convertersListConfigurer = (this.convertersListConfigurer != null) ?
this.convertersListConfigurer.andThen(this.convertersListConfigurer) : configurer;
} }
List<HttpMessageConverter<?>> getBaseConverters() { List<HttpMessageConverter<?>> getBaseConverters() {
@ -475,13 +476,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters {
if (this.registerDefaults) { if (this.registerDefaults) {
allConverters.addAll(this.getCoreConverters()); allConverters.addAll(this.getCoreConverters());
} }
if (this.configurer != null) {
allConverters.forEach(this.configurer);
}
if (this.convertersListConfigurer != null) { if (this.convertersListConfigurer != null) {
this.convertersListConfigurer.accept(allConverters); this.convertersListConfigurer.accept(allConverters);
} }
if (this.configurer != null) {
allConverters.forEach(this.configurer);
}
return new DefaultHttpMessageConverters(allConverters); return new DefaultHttpMessageConverters(allConverters);
} }
} }
@ -586,13 +586,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters {
if (this.registerDefaults) { if (this.registerDefaults) {
allConverters.addAll(this.getCoreConverters()); allConverters.addAll(this.getCoreConverters());
} }
if (this.configurer != null) {
allConverters.forEach(this.configurer);
}
if (this.convertersListConfigurer != null) { if (this.convertersListConfigurer != null) {
this.convertersListConfigurer.accept(allConverters); this.convertersListConfigurer.accept(allConverters);
} }
if (this.configurer != null) {
allConverters.forEach(this.configurer);
}
return new DefaultHttpMessageConverters(allConverters); return new DefaultHttpMessageConverters(allConverters);
} }
} }

11
spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java

@ -168,16 +168,19 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
T addCustomConverter(HttpMessageConverter<?> customConverter); T addCustomConverter(HttpMessageConverter<?> customConverter);
/** /**
* Add a consumer for configuring the selected message converters. * Add a consumer for mutating the list of selected message converters.
* <p>This operation happens before converters are
* {@link #configureMessageConverters(Consumer) configured individually}.</p>
* @param configurer the configurer to use * @param configurer the configurer to use
* @since 7.0.3
*/ */
T configureMessageConverters(Consumer<HttpMessageConverter<?>> configurer); T configureMessageConvertersList(Consumer<List<HttpMessageConverter<?>>> configurer);
/** /**
* Add a consumer for configuring the message converters list just before it's returned. * Add a consumer for configuring the selected message converters.
* @param configurer the configurer to use * @param configurer the configurer to use
*/ */
T configureMessageConvertersList(Consumer<List<HttpMessageConverter<?>>> configurer); T configureMessageConverters(Consumer<HttpMessageConverter<?>> configurer);
/** /**
* Build and return the {@link HttpMessageConverters} instance configured by this builder. * Build and return the {@link HttpMessageConverters} instance configured by this builder.

46
spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java

@ -17,11 +17,9 @@
package org.springframework.http.converter; package org.springframework.http.converter;
import java.io.IOException; import java.io.IOException;
import java.util.Comparator;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
@ -214,24 +212,14 @@ class DefaultHttpMessageConvertersTests {
} }
@Test @Test
void shouldConfigureConverterOrder() { void shouldAppendCustomConverterToList() {
var customConverter = new CustomHttpMessageConverter(); var customConverter = new CustomHttpMessageConverter();
var converted = HttpMessageConverters.forClient() var messageConverters = HttpMessageConverters.forClient()
.addCustomConverter(customConverter) .registerDefaults()
.configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? 1 : -1))).build(); .configureMessageConvertersList(converters -> converters.add(customConverter))
.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);
assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class);
} }
} }
@ -344,24 +332,14 @@ class DefaultHttpMessageConvertersTests {
} }
@Test @Test
void shouldConfigureConverterOrder() { void shouldAppendCustomConverterToList() {
var customConverter = new CustomHttpMessageConverter(); var customConverter = new CustomHttpMessageConverter();
var converted = HttpMessageConverters.forServer() var messageConverters = HttpMessageConverters.forServer()
.addCustomConverter(customConverter) .registerDefaults()
.configureMessageConvertersList(converter -> converter.sort(Comparator.comparing(s -> s.getClass().equals(CustomHttpMessageConverter.class) ? 1 : -1))).build(); .configureMessageConvertersList(converters -> converters.add(customConverter))
.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);
assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class);
} }
} }

Loading…
Cancel
Save