From d98179e13726a286cf01fa0ea168ead104676aaa Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 1 Oct 2025 20:18:39 +0200 Subject: [PATCH] Enforce custom string converter in HttpMessageConverters Prior to this commit, configuring a custom `StringHttpMessageConverter` would be overwritten when the `registerDefaults()` option is enabled. Fixes gh-35563 --- .../DefaultHttpMessageConverters.java | 4 +++- .../DefaultHttpMessageConvertersTests.java | 21 +++++++++++++++++++ 2 files changed, 24 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 fa5df2f40e7..fa6f5e1eb1f 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 @@ -247,8 +247,10 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { void detectMessageConverters() { this.byteArrayMessageConverter = new ByteArrayHttpMessageConverter(); - this.stringMessageConverter = new StringHttpMessageConverter(); + if (this.stringMessageConverter == null) { + this.stringMessageConverter = new StringHttpMessageConverter(); + } if (this.jsonMessageConverter == null) { if (JACKSON_PRESENT) { this.jsonMessageConverter = new JacksonJsonHttpMessageConverter(); 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 fc5028f107f..042ef780eb2 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 @@ -177,6 +177,16 @@ class DefaultHttpMessageConvertersTests { assertThat(customConverter).isEqualTo(jacksonConverter); } + @Test + void shouldOverrideStringConverters() { + var stringConverter = new StringHttpMessageConverter(); + var converters = HttpMessageConverters.forClient().registerDefaults() + .stringMessageConverter(stringConverter).build(); + + var actualConverter = findMessageConverter(StringHttpMessageConverter.class, converters); + assertThat(actualConverter).isEqualTo(stringConverter); + } + @Test void shouldConfigureConverter() { var customConverter = new CustomHttpMessageConverter(); @@ -271,6 +281,17 @@ class DefaultHttpMessageConvertersTests { assertThat(customConverter).isEqualTo(jacksonConverter); } + + @Test + void shouldOverrideStringConverters() { + var stringConverter = new StringHttpMessageConverter(); + var converters = HttpMessageConverters.forServer().registerDefaults() + .stringMessageConverter(stringConverter).build(); + + var actualConverter = findMessageConverter(StringHttpMessageConverter.class, converters); + assertThat(actualConverter).isEqualTo(stringConverter); + } + @Test void shouldConfigureConverter() { var customConverter = new CustomHttpMessageConverter();