Restore HttpMessageConverters ordering

Temporarily add reordering logic to `HttpMessageConverters` to restore
the Spring Boot 3.5 order.

See gh-46221
This commit is contained in:
Phillip Webb
2025-06-26 22:31:31 -07:00
parent 9e16849d7a
commit fd34f80bf1
2 changed files with 36 additions and 8 deletions
@@ -26,8 +26,11 @@ import java.util.List;
import java.util.Map;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.util.ClassUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@@ -184,13 +187,14 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>>
List<HttpMessageConverter<?>> converters = new ArrayList<>();
if (ClassUtils.isPresent("org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport",
null)) {
converters.addAll(new WebMvcConfigurationSupport() {
List<HttpMessageConverter<?>> webMvcConverters = new WebMvcConfigurationSupport() {
public List<HttpMessageConverter<?>> defaultMessageConverters() {
return super.getMessageConverters();
}
}.defaultMessageConverters());
}.defaultMessageConverters();
converters.addAll(reorderAllEncompassingFormHttpMessageConverterBeforeJackson(webMvcConverters));
}
else {
converters.addAll(new RestTemplate().getMessageConverters());
@@ -199,6 +203,30 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>>
return converters;
}
@SuppressWarnings("removal")
private List<HttpMessageConverter<?>> reorderAllEncompassingFormHttpMessageConverterBeforeJackson(
List<HttpMessageConverter<?>> converters) {
List<HttpMessageConverter<?>> reordered = new ArrayList<>();
for (int i = 0; i < converters.size(); i++) {
HttpMessageConverter<?> converter = converters.get(i);
if (converter == null) {
continue;
}
if (converter instanceof MappingJackson2XmlHttpMessageConverter
|| converter instanceof MappingJackson2HttpMessageConverter
|| converter instanceof MappingJackson2CborHttpMessageConverter) {
for (int j = i; j < converters.size(); j++) {
if (converters.get(j) instanceof AllEncompassingFormHttpMessageConverter) {
reordered.add(converters.get(j));
converters.set(j, null);
}
}
}
reordered.add(converter);
}
return reordered;
}
@SuppressWarnings("removal")
private void reorderXmlConvertersToEnd(List<HttpMessageConverter<?>> converters) {
List<HttpMessageConverter<?>> xml = new ArrayList<>();
@@ -56,9 +56,9 @@ class HttpMessageConvertersTests {
}
assertThat(converterClasses).containsExactly(ByteArrayHttpMessageConverter.class,
StringHttpMessageConverter.class, ResourceHttpMessageConverter.class,
ResourceRegionHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class,
MappingJackson2CborHttpMessageConverter.class, MappingJackson2YamlHttpMessageConverter.class,
AllEncompassingFormHttpMessageConverter.class, MappingJackson2XmlHttpMessageConverter.class);
ResourceRegionHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class,
MappingJackson2HttpMessageConverter.class, MappingJackson2CborHttpMessageConverter.class,
MappingJackson2YamlHttpMessageConverter.class, MappingJackson2XmlHttpMessageConverter.class);
}
@Test
@@ -126,9 +126,9 @@ class HttpMessageConvertersTests {
}
assertThat(converterClasses).containsExactly(ByteArrayHttpMessageConverter.class,
StringHttpMessageConverter.class, ResourceHttpMessageConverter.class,
ResourceRegionHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class,
MappingJackson2CborHttpMessageConverter.class, MappingJackson2YamlHttpMessageConverter.class,
AllEncompassingFormHttpMessageConverter.class);
ResourceRegionHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class,
MappingJackson2HttpMessageConverter.class, MappingJackson2CborHttpMessageConverter.class,
MappingJackson2YamlHttpMessageConverter.class);
}
@Test