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 bedffb57fc1..991cb6df908 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 @@ -17,8 +17,6 @@ package org.springframework.http.converter; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.function.Consumer; @@ -110,7 +108,9 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { @Nullable HttpMessageConverter stringMessageConverter; - List> resourceMessageConverters = Collections.emptyList(); + @Nullable HttpMessageConverter resourceMessageConverter; + + @Nullable HttpMessageConverter resourceRegionMessageConverter; @Nullable Consumer> configurer; @@ -386,7 +386,7 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { @Override public HttpMessageConverters build() { if (this.registerDefaults) { - this.resourceMessageConverters = Collections.singletonList(new ResourceHttpMessageConverter(false)); + this.resourceMessageConverter = new ResourceHttpMessageConverter(false); detectMessageConverters(); } List> allConverters = new ArrayList<>(); @@ -396,8 +396,10 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { allConverters.addAll(this.getCustomConverters()); allConverters.addAll(this.getBaseConverters()); - allConverters.addAll(this.resourceMessageConverters); - if (!partConverters.isEmpty()) { + if (this.resourceMessageConverter != null) { + allConverters.add(this.resourceMessageConverter); + } + if (!partConverters.isEmpty() || !allConverters.isEmpty()) { allConverters.add(new AllEncompassingFormHttpMessageConverter(partConverters)); } allConverters.addAll(this.getCoreConverters()); @@ -468,7 +470,8 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { @Override public HttpMessageConverters build() { if (this.registerDefaults) { - this.resourceMessageConverters = Arrays.asList(new ResourceHttpMessageConverter(), new ResourceRegionHttpMessageConverter()); + this.resourceMessageConverter = new ResourceHttpMessageConverter(); + this.resourceRegionMessageConverter = new ResourceRegionHttpMessageConverter(); detectMessageConverters(); } List> allConverters = new ArrayList<>(); @@ -479,8 +482,13 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { allConverters.addAll(this.getCustomConverters()); allConverters.addAll(this.getBaseConverters()); - allConverters.addAll(this.resourceMessageConverters); - if (!partConverters.isEmpty()) { + if (this.resourceMessageConverter != null) { + allConverters.add(this.resourceMessageConverter); + } + if (this.resourceRegionMessageConverter != null) { + allConverters.add(this.resourceRegionMessageConverter); + } + if (!partConverters.isEmpty() || !allConverters.isEmpty()) { allConverters.add(new AllEncompassingFormHttpMessageConverter(partConverters)); } allConverters.addAll(this.getCoreConverters()); 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 9147b968869..fc5028f107f 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 @@ -160,6 +160,13 @@ class DefaultHttpMessageConvertersTests { assertThat(multipartConverter.getPartConverters()).hasAtLeastOneElementOfType(CustomHttpMessageConverter.class); } + @Test + void registerMultipartConverterWhenOtherConvertersPresent() { + var converters = HttpMessageConverters.forClient() + .stringMessageConverter(new StringHttpMessageConverter()).build(); + assertThat(converters).hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + } + @Test void shouldUseSpecificConverter() { var jacksonConverter = new JacksonJsonHttpMessageConverter(); @@ -248,7 +255,14 @@ class DefaultHttpMessageConvertersTests { } @Test - void shouldUseServerSpecificConverter() { + void registerMultipartConverterWhenOtherConvertersPresent() { + var converters = HttpMessageConverters.forServer() + .stringMessageConverter(new StringHttpMessageConverter()).build(); + assertThat(converters).hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + } + + @Test + void shouldUseSpecificConverter() { var jacksonConverter = new JacksonJsonHttpMessageConverter(); var converters = HttpMessageConverters.forServer().registerDefaults() .jsonMessageConverter(jacksonConverter).build(); diff --git a/spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java b/spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java index f9ba5066991..c0f33f9a76d 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java @@ -33,6 +33,7 @@ import org.springframework.http.client.JettyClientHttpRequestFactory; import org.springframework.http.client.support.BasicAuthenticationInterceptor; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.web.util.DefaultUriBuilderFactory; import static org.assertj.core.api.Assertions.assertThat; @@ -150,7 +151,7 @@ public class RestClientBuilderTests { assertThat(fieldValue("messageConverters", defaultBuilder)) .asInstanceOf(InstanceOfAssertFactories.LIST) - .containsExactly(stringConverter); + .hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); } @Test