Skip to content

Commit ef0aca4

Browse files
committed
Closes gh-36043 Adds ability to add message converter at specific index to builders, and propagates through to java.util.List.add(idx, ...)
Signed-off-by: Hayden Rear hayden.rear@gmail.com
1 parent e9a4b93 commit ef0aca4

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,9 @@ private void checkConverterSupports(HttpMessageConverter<?> converter, MediaType
217217
throw new IllegalArgumentException("converter should support '" + mediaType + "'");
218218
}
219219

220-
void addCustomMessageConverter(HttpMessageConverter<?> customConverter) {
220+
void addCustomMessageConverter(int index, HttpMessageConverter<?> customConverter) {
221221
Assert.notNull(customConverter, "'customConverter' must not be null");
222-
this.customConverters.add(customConverter);
222+
this.customConverters.add(index, customConverter);
223223
}
224224

225225
void addMessageConverterConfigurer(Consumer<HttpMessageConverter<?>> configurer) {
@@ -432,7 +432,13 @@ public ClientBuilder withYamlConverter(HttpMessageConverter<?> yamlConverter) {
432432

433433
@Override
434434
public ClientBuilder addCustomConverter(HttpMessageConverter<?> customConverter) {
435-
addCustomMessageConverter(customConverter);
435+
addCustomConverter(0, customConverter);
436+
return this;
437+
}
438+
439+
@Override
440+
public ClientBuilder addCustomConverter(int index, HttpMessageConverter<?> customConverter) {
441+
addCustomMessageConverter(index, customConverter);
436442
return this;
437443
}
438444

@@ -529,7 +535,13 @@ public ServerBuilder withYamlConverter(HttpMessageConverter<?> yamlConverter) {
529535

530536
@Override
531537
public ServerBuilder addCustomConverter(HttpMessageConverter<?> customConverter) {
532-
addCustomMessageConverter(customConverter);
538+
addCustomMessageConverter(0, customConverter);
539+
return this;
540+
}
541+
542+
@Override
543+
public ServerBuilder addCustomConverter(int index, HttpMessageConverter<?> customConverter) {
544+
addCustomMessageConverter(0, customConverter);
533545
return this;
534546
}
535547

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,14 @@ interface Builder<T extends Builder<T>> {
166166
*/
167167
T addCustomConverter(HttpMessageConverter<?> customConverter);
168168

169+
170+
/**
171+
* Add a custom {@code HttpMessageConverter} to the list of converters, at the specified index, pushing all existing message converters forward one.
172+
* @param customConverter the converter instance to add
173+
* @param index index at which the specified element is to be inserted
174+
*/
175+
T addCustomConverter(int index, HttpMessageConverter<?> customConverter);
176+
169177
/**
170178
* Add a consumer for configuring the selected message converters.
171179
* @param configurer the configurer to use

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,22 @@ void registerCustomMessageConverter() {
147147
assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class);
148148
}
149149

150+
@Test
151+
void registerCustomMessageConverterAtIndex() {
152+
var clientBuilder = HttpMessageConverters.forClient()
153+
.addCustomConverter(0, new CustomHttpMessageConverter());
154+
var converters = clientBuilder.build();
155+
156+
assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class);
157+
158+
clientBuilder.addCustomConverter(0, new CustomHttpMessageConverter());
159+
converters = clientBuilder.build();
160+
161+
assertThat(converters).hasExactlyElementsOfTypes(
162+
CustomHttpMessageConverter.class, CustomHttpMessageConverter.class,
163+
AllEncompassingFormHttpMessageConverter.class);
164+
}
165+
150166
@Test
151167
void registerCustomMessageConverterAheadOfDefaults() {
152168
var converters = HttpMessageConverters.forClient().registerDefaults()

0 commit comments

Comments
 (0)