diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConverters.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConverters.java index e5673926935b..dcaed01352d7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConverters.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConverters.java @@ -26,6 +26,7 @@ import java.util.Map; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; @@ -121,14 +122,24 @@ private List> getCombinedConverters(Collection> processing = new ArrayList<>(converters); for (HttpMessageConverter defaultConverter : defaultConverters) { Iterator> iterator = processing.iterator(); + boolean skipDefault = false; while (iterator.hasNext()) { HttpMessageConverter candidate = iterator.next(); if (isReplacement(defaultConverter, candidate)) { combined.add(candidate); iterator.remove(); + + if (defaultConverter instanceof StringHttpMessageConverter + && defaultConverter.getSupportedMediaTypes().equals(candidate.getSupportedMediaTypes())) { + skipDefault = true; + } } } - combined.add(defaultConverter); + + if (!skipDefault) { + combined.add(defaultConverter); + } + if (defaultConverter instanceof AllEncompassingFormHttpMessageConverter allEncompassingConverter) { configurePartConverters(allEncompassingConverter, converters); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersTests.java index 17dcc631d124..c4633bc691b3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.autoconfigure.http; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -163,4 +164,19 @@ private AllEncompassingFormHttpMessageConverter findFormConverter(Collection httpConverters = new ArrayList<>(); + for (HttpMessageConverter candidate : converters) { + if (candidate instanceof StringHttpMessageConverter) { + httpConverters.add((StringHttpMessageConverter) candidate); + } + } + + assertThat(httpConverters).hasSize(1); + assertThat(httpConverters.get(0)).isEqualTo(converter); + } }