From 5ef9972528716afdec0450a0e1befa1250fe88d8 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 11 Feb 2026 18:37:12 +0100 Subject: [PATCH] Allow to disable defaults in HttpMessageConverters The builder for `HttpMessageConverters` allows for auto-detection of message converters on the classpath and their default registration when `registerDefaults()` is called. Once called, there is no way to undo this. This commit adds a new `disableDefaults()` method to disable the default registration and take full control over the list of message converters. Closes gh-36303 --- .../http/converter/DefaultHttpMessageConverters.java | 12 ++++++++++++ .../http/converter/HttpMessageConverters.java | 9 +++++++++ .../converter/DefaultHttpMessageConvertersTests.java | 12 ++++++++++++ 3 files changed, 33 insertions(+) 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 8ccb13c3bb1..0bd936c977c 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 @@ -389,6 +389,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { return this; } + @Override + public ClientBuilder disableDefaults() { + this.registerDefaults = false; + return this; + } + @Override public ClientBuilder withStringConverter(HttpMessageConverter stringConverter) { setStringConverter(stringConverter); @@ -495,6 +501,12 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { return this; } + @Override + public ServerBuilder disableDefaults() { + this.registerDefaults = false; + return this; + } + @Override public ServerBuilder withStringConverter(HttpMessageConverter stringConverter) { setStringConverter(stringConverter); 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 254bc359216..c7b96340f0e 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 @@ -97,6 +97,15 @@ public interface HttpMessageConverters extends Iterable> */ T registerDefaults(); + /** + * Prevent the registration of default converters using classpath detection. + * Manual registrations like {@link #withJsonConverter(HttpMessageConverter)} are + * still allowed. If both {@link #registerDefaults()} and this method are called, + * the latest call wins. + * @since 7.0.4 + */ + T disableDefaults(); + /** * Override the default String {@code HttpMessageConverter} * with any converter supporting String conversion. 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 35a58330df2..a9196ce44c5 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 @@ -125,6 +125,12 @@ class DefaultHttpMessageConvertersTests { RssChannelHttpMessageConverter.class); } + @Test + void disableDefaults() { + var converters = HttpMessageConverters.forClient().registerDefaults().disableDefaults().build(); + assertThat(converters).isEmpty(); + } + @Test void multipartConverterContainsOtherConverters() { var converters = HttpMessageConverters.forClient().registerDefaults().build(); @@ -242,6 +248,12 @@ class DefaultHttpMessageConvertersTests { RssChannelHttpMessageConverter.class); } + @Test + void disableDefaults() { + var converters = HttpMessageConverters.forServer().registerDefaults().disableDefaults().build(); + assertThat(converters).isEmpty(); + } + @Test void multipartConverterContainsOtherConverters() { var converters = HttpMessageConverters.forServer().registerDefaults().build();