Skip to content

Commit 7be318d

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 7be318d

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

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

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

220+
void addCustomMessageConverter(int index, HttpMessageConverter<?> customConverter) {
221+
Assert.notNull(customConverter, "'customConverter' must not be null");
222+
this.customConverters.add(index, customConverter);
223+
}
224+
220225
void addCustomMessageConverter(HttpMessageConverter<?> customConverter) {
221226
Assert.notNull(customConverter, "'customConverter' must not be null");
222227
this.customConverters.add(customConverter);
@@ -432,7 +437,13 @@ public ClientBuilder withYamlConverter(HttpMessageConverter<?> yamlConverter) {
432437

433438
@Override
434439
public ClientBuilder addCustomConverter(HttpMessageConverter<?> customConverter) {
435-
addCustomMessageConverter(customConverter);
440+
addCustomConverter(customConverter);
441+
return this;
442+
}
443+
444+
@Override
445+
public ClientBuilder addCustomConverter(int index, HttpMessageConverter<?> customConverter) {
446+
addCustomMessageConverter(index, customConverter);
436447
return this;
437448
}
438449

@@ -533,6 +544,12 @@ public ServerBuilder addCustomConverter(HttpMessageConverter<?> customConverter)
533544
return this;
534545
}
535546

547+
@Override
548+
public ServerBuilder addCustomConverter(int index, HttpMessageConverter<?> customConverter) {
549+
addCustomMessageConverter(index, customConverter);
550+
return this;
551+
}
552+
536553
@Override
537554
public ServerBuilder configureMessageConverters(Consumer<HttpMessageConverter<?>> configurer) {
538555
addMessageConverterConfigurer(configurer);

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)