Fix HttpMessageConverters configurers support

This commit fixes the `configureMessageConverters` and
`configureMessageConvertersList` behavior.

`configureMessageConverters` was not executing consumers in their order
of registration (but in the reverse order).
`configureMessageConvertersList` was not executing multiple consumers
and was instead executing the first consumer multiple times.

This commit fixes both issues.

Fixes gh-36332
This commit is contained in:
Brian Clozel
2026-02-16 18:48:26 +01:00
parent d712ec3d49
commit b9e190e313
2 changed files with 31 additions and 13 deletions
@@ -210,22 +210,31 @@ class DefaultHttpMessageConvertersTests {
.addCustomConverter(customConverter)
.configureMessageConverters(converter -> {
if (converter instanceof CustomHttpMessageConverter custom) {
custom.processed = true;
assertThat(custom.processCount).isZero();
custom.processCount++;
}
})
.configureMessageConverters(converter -> {
if (converter instanceof CustomHttpMessageConverter custom) {
assertThat(custom.processCount).isEqualTo(1);
custom.processCount++;
}
}).build();
assertThat(customConverter.processed).isTrue();
assertThat(customConverter.processCount).isEqualTo(2);
}
@Test
void shouldAppendCustomConverterToList() {
var customConverter = new CustomHttpMessageConverter();
var firstCustom = new CustomHttpMessageConverter();
var secondCustom = new CustomHttpMessageConverter();
var messageConverters = HttpMessageConverters.forClient()
.registerDefaults()
.configureMessageConvertersList(converters -> converters.add(customConverter))
.configureMessageConvertersList(converters -> converters.add(firstCustom))
.configureMessageConvertersList(converters -> converters.add(secondCustom))
.build();
assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class);
assertThat(messageConverters).containsSequence(firstCustom, secondCustom);
}
}
@@ -336,22 +345,31 @@ class DefaultHttpMessageConvertersTests {
.addCustomConverter(customConverter)
.configureMessageConverters(converter -> {
if (converter instanceof CustomHttpMessageConverter custom) {
custom.processed = true;
assertThat(custom.processCount).isZero();
custom.processCount++;
}
})
.configureMessageConverters(converter -> {
if (converter instanceof CustomHttpMessageConverter custom) {
assertThat(custom.processCount).isEqualTo(1);
custom.processCount++;
}
}).build();
assertThat(customConverter.processed).isTrue();
assertThat(customConverter.processCount).isEqualTo(2);
}
@Test
void shouldAppendCustomConverterToList() {
var customConverter = new CustomHttpMessageConverter();
var firstCustom = new CustomHttpMessageConverter();
var secondCustom = new CustomHttpMessageConverter();
var messageConverters = HttpMessageConverters.forServer()
.registerDefaults()
.configureMessageConvertersList(converters -> converters.add(customConverter))
.configureMessageConvertersList(converters -> converters.add(firstCustom))
.configureMessageConvertersList(converters -> converters.add(secondCustom))
.build();
assertThat(messageConverters).last().isInstanceOf(CustomHttpMessageConverter.class);
assertThat(messageConverters).containsSequence(firstCustom, secondCustom);
}
}
@@ -365,7 +383,7 @@ class DefaultHttpMessageConvertersTests {
static class CustomHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
boolean processed = false;
int processCount;
@Override
protected boolean supports(Class<?> clazz) {