From aebf7c97f7a704ab666cd277b3f09983332b5064 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 1 Apr 2026 10:49:55 +0200 Subject: [PATCH] Register overrides in HttpMessageConverters when defaults are off Prior to this commit, all `with**Converter` methods in `HttpMessageConverters` builders would only apply if the `registerDefaults()` option is on. While the original intent is to allow overrides for auto-detected defaults, this creates an unnecessary discrepancy with `addCustomConverter` which is always effective. Allowing sich registrations when defaults are off should not introduce invalid states and only reflects the intent of the developer. This commit now allows such cases. Fixes gh-36579 --- .../DefaultHttpMessageConverters.java | 34 +++++++------------ .../DefaultHttpMessageConvertersTests.java | 15 +++++--- 2 files changed, 23 insertions(+), 26 deletions(-) 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 0c50bb36955..f4fdd6c8734 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 @@ -469,19 +469,15 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { } List> partConverters = new ArrayList<>(this.getCustomConverters()); List> allConverters = new ArrayList<>(this.getCustomConverters()); - if (this.registerDefaults) { - partConverters.addAll(this.getCoreConverters()); - allConverters.addAll(this.getBaseConverters()); - if (this.resourceConverter != null) { - allConverters.add(this.resourceConverter); - } + partConverters.addAll(this.getCoreConverters()); + allConverters.addAll(this.getBaseConverters()); + if (this.resourceConverter != null) { + allConverters.add(this.resourceConverter); } if (!partConverters.isEmpty() || !allConverters.isEmpty()) { allConverters.add(new AllEncompassingFormHttpMessageConverter(partConverters)); } - if (this.registerDefaults) { - allConverters.addAll(this.getCoreConverters()); - } + allConverters.addAll(this.getCoreConverters()); if (this.convertersListConfigurer != null) { this.convertersListConfigurer.accept(allConverters); } @@ -582,22 +578,18 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { } List> partConverters = new ArrayList<>(this.getCustomConverters()); List> allConverters = new ArrayList<>(this.getCustomConverters()); - if (this.registerDefaults) { - partConverters.addAll(this.getCoreConverters()); - allConverters.addAll(this.getBaseConverters()); - if (this.resourceConverter != null) { - allConverters.add(this.resourceConverter); - } - if (this.resourceRegionConverter != null) { - allConverters.add(this.resourceRegionConverter); - } + partConverters.addAll(this.getCoreConverters()); + allConverters.addAll(this.getBaseConverters()); + if (this.resourceConverter != null) { + allConverters.add(this.resourceConverter); + } + if (this.resourceRegionConverter != null) { + allConverters.add(this.resourceRegionConverter); } if (!partConverters.isEmpty() || !allConverters.isEmpty()) { allConverters.add(new AllEncompassingFormHttpMessageConverter(partConverters)); } - if (this.registerDefaults) { - allConverters.addAll(this.getCoreConverters()); - } + allConverters.addAll(this.getCoreConverters()); if (this.convertersListConfigurer != null) { this.convertersListConfigurer.accept(allConverters); } 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 dcef8369b35..0c0cb5af427 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,10 +177,13 @@ class DefaultHttpMessageConvertersTests { } @Test - void shouldNotConfigureOverridesWhenDefaultOff() { + void shouldConfigureOverridesWhenDefaultOff() { var stringConverter = new StringHttpMessageConverter(); var converters = HttpMessageConverters.forClient().withStringConverter(stringConverter).build(); - assertThat(converters).isEmpty(); + assertThat(converters).hasExactlyElementsOfTypes( + StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + var configured = findMessageConverter(StringHttpMessageConverter.class, converters); + assertThat(configured).isEqualTo(stringConverter); } @Test @@ -309,12 +312,14 @@ class DefaultHttpMessageConvertersTests { assertThat(multipartConverter.getPartConverters()).hasAtLeastOneElementOfType(CustomHttpMessageConverter.class); } - @Test - void shouldNotConfigureOverridesWhenDefaultOff() { + void shouldConfigureOverridesWhenDefaultOff() { var stringConverter = new StringHttpMessageConverter(); var converters = HttpMessageConverters.forServer().withStringConverter(stringConverter).build(); - assertThat(converters).isEmpty(); + assertThat(converters).hasExactlyElementsOfTypes( + StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + var configured = findMessageConverter(StringHttpMessageConverter.class, converters); + assertThat(configured).isEqualTo(stringConverter); } @Test