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
This commit is contained in:
Brian Clozel
2026-02-11 18:37:12 +01:00
parent a9b1d6335e
commit 5ef9972528
3 changed files with 33 additions and 0 deletions
@@ -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);
@@ -97,6 +97,15 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
*/
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.
@@ -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();