From 7be318d15dacf506d1d32cb218bc412090c636a6 Mon Sep 17 00:00:00 2001 From: "hayden.rear" Date: Thu, 18 Dec 2025 19:07:33 -0500 Subject: [PATCH 1/2] 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 --- .../DefaultHttpMessageConverters.java | 19 ++++++++++++++++++- .../http/converter/HttpMessageConverters.java | 8 ++++++++ .../DefaultHttpMessageConvertersTests.java | 16 ++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) 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 f955acc53857..d55b4ba539c0 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 @@ -217,6 +217,11 @@ private void checkConverterSupports(HttpMessageConverter converter, MediaType throw new IllegalArgumentException("converter should support '" + mediaType + "'"); } + void addCustomMessageConverter(int index, HttpMessageConverter customConverter) { + Assert.notNull(customConverter, "'customConverter' must not be null"); + this.customConverters.add(index, customConverter); + } + void addCustomMessageConverter(HttpMessageConverter customConverter) { Assert.notNull(customConverter, "'customConverter' must not be null"); this.customConverters.add(customConverter); @@ -432,7 +437,13 @@ public ClientBuilder withYamlConverter(HttpMessageConverter yamlConverter) { @Override public ClientBuilder addCustomConverter(HttpMessageConverter customConverter) { - addCustomMessageConverter(customConverter); + addCustomConverter(customConverter); + return this; + } + + @Override + public ClientBuilder addCustomConverter(int index, HttpMessageConverter customConverter) { + addCustomMessageConverter(index, customConverter); return this; } @@ -533,6 +544,12 @@ public ServerBuilder addCustomConverter(HttpMessageConverter customConverter) return this; } + @Override + public ServerBuilder addCustomConverter(int index, HttpMessageConverter customConverter) { + addCustomMessageConverter(index, customConverter); + return this; + } + @Override public ServerBuilder configureMessageConverters(Consumer> configurer) { addMessageConverterConfigurer(configurer); 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 61bc33ab9bc4..48be5baad26c 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 @@ -166,6 +166,14 @@ interface Builder> { */ T addCustomConverter(HttpMessageConverter customConverter); + + /** + * Add a custom {@code HttpMessageConverter} to the list of converters, at the specified index, pushing all existing message converters forward one. + * @param customConverter the converter instance to add + * @param index index at which the specified element is to be inserted + */ + T addCustomConverter(int index, HttpMessageConverter customConverter); + /** * Add a consumer for configuring the selected message converters. * @param configurer the configurer to use 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 f939e9b227ac..ba6f388bc2f1 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 @@ -147,6 +147,22 @@ void registerCustomMessageConverter() { assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); } + @Test + void registerCustomMessageConverterAtIndex() { + var clientBuilder = HttpMessageConverters.forClient() + .addCustomConverter(0, new CustomHttpMessageConverter()); + var converters = clientBuilder.build(); + + assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + + clientBuilder.addCustomConverter(0, new CustomHttpMessageConverter()); + converters = clientBuilder.build(); + + assertThat(converters).hasExactlyElementsOfTypes( + CustomHttpMessageConverter.class, CustomHttpMessageConverter.class, + AllEncompassingFormHttpMessageConverter.class); + } + @Test void registerCustomMessageConverterAheadOfDefaults() { var converters = HttpMessageConverters.forClient().registerDefaults() From 196b7a99d4db79e72f394b0d5917cc3c02a7f545 Mon Sep 17 00:00:00 2001 From: "hayden.rear" Date: Thu, 18 Dec 2025 19:07:51 -0500 Subject: [PATCH 2/2] 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 --- .../http/converter/DefaultHttpMessageConverters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d55b4ba539c0..1d7053e6ed2d 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 @@ -437,7 +437,7 @@ public ClientBuilder withYamlConverter(HttpMessageConverter yamlConverter) { @Override public ClientBuilder addCustomConverter(HttpMessageConverter customConverter) { - addCustomConverter(customConverter); + addCustomMessageConverter(customConverter); return this; }