From af026c0373e0a6ff7452ab8bb8949ff6c77a6ab1 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 31 Oct 2025 17:18:28 +0100 Subject: [PATCH] Review HttpMessageConverters semantics in Builder Prior to this commit, the `HttpMessageConverters` builder API had methods like "jsonMessageConverter" for configuring a specific converter for JSON support. This converter would be always configured at a given position, even if default converters registration is not requested. On the other hand, `customMessageConverter` would add any converter ahead of the list, in all cases. This difference was not conveyed as it should by the API. This commit makes the following changes: * builder methods are renamed to `withJsonConverter` and variants, to better convey the fact that those are replacing the default converter for a given format. * `customMessageConverter` is renamed to `addCustomConverter` to better reflect the additive aspect. * the JavaDoc has been updated accordingly * `withJsonConverter` and others are now only effective if the default registration of auto-detected converters is requested. This better aligns with the behavior in the reactive codecs configuration Closes gh-35704 --- .../WebConfiguration.java | 4 +- .../WebConfiguration.kt | 4 +- .../DefaultHttpMessageConverters.java | 77 ++++++++++--------- .../http/converter/HttpMessageConverters.java | 24 +++--- .../web/client/DefaultRestClientBuilder.java | 2 +- .../DefaultHttpMessageConvertersTests.java | 53 ++++++------- .../web/client/RestClientBuilderTests.java | 2 +- .../client/RestClientObservationTests.java | 2 +- .../DelegatingWebMvcConfigurationTests.java | 2 +- ...MvcConfigurationSupportExtensionTests.java | 8 +- 10 files changed, 91 insertions(+), 87 deletions(-) diff --git a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java index cfdba475159..f5290333bd3 100644 --- a/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java +++ b/framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java @@ -44,8 +44,8 @@ public class WebConfiguration implements WebMvcConfigurer { .findAndAddModules() .defaultUseWrapper(false) .build(); - builder.jsonMessageConverter(new JacksonJsonHttpMessageConverter(jsonMapper)) - .xmlMessageConverter(new JacksonXmlHttpMessageConverter(xmlMapper)); + builder.withJsonConverter(new JacksonJsonHttpMessageConverter(jsonMapper)) + .withXmlConverter(new JacksonXmlHttpMessageConverter(xmlMapper)); } } // end::snippet[] diff --git a/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt b/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt index 476f717b462..854f43ff767 100644 --- a/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt +++ b/framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt @@ -26,8 +26,8 @@ class WebConfiguration : WebMvcConfigurer { .findAndAddModules() .defaultUseWrapper(false) .build() - builder.jsonMessageConverter(JacksonJsonHttpMessageConverter(jsonMapper)) - .xmlMessageConverter(JacksonXmlHttpMessageConverter(xmlMapper)) + builder.withJsonConverter(JacksonJsonHttpMessageConverter(jsonMapper)) + .withXmlConverter(JacksonXmlHttpMessageConverter(xmlMapper)) } } // end::snippet[] \ No newline at end of file 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 fa6f5e1eb1f..5b273b14d29 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 @@ -338,43 +338,43 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { } @Override - public ClientBuilder stringMessageConverter(HttpMessageConverter stringMessageConverter) { + public ClientBuilder withStringConverter(HttpMessageConverter stringMessageConverter) { setStringMessageConverter(stringMessageConverter); return this; } @Override - public ClientBuilder jsonMessageConverter(HttpMessageConverter jsonMessageConverter) { + public ClientBuilder withJsonConverter(HttpMessageConverter jsonMessageConverter) { setJsonMessageConverter(jsonMessageConverter); return this; } @Override - public ClientBuilder xmlMessageConverter(HttpMessageConverter xmlMessageConverter) { + public ClientBuilder withXmlConverter(HttpMessageConverter xmlMessageConverter) { setXmlMessageConverter(xmlMessageConverter); return this; } @Override - public ClientBuilder smileMessageConverter(HttpMessageConverter smileMessageConverter) { + public ClientBuilder withSmileConverter(HttpMessageConverter smileMessageConverter) { setSmileMessageConverter(smileMessageConverter); return this; } @Override - public ClientBuilder cborMessageConverter(HttpMessageConverter cborMessageConverter) { + public ClientBuilder withCborConverter(HttpMessageConverter cborMessageConverter) { setCborMessageConverter(cborMessageConverter); return this; } @Override - public ClientBuilder yamlMessageConverter(HttpMessageConverter yamlMessageConverter) { + public ClientBuilder withYamlConverter(HttpMessageConverter yamlMessageConverter) { setYamlMessageConverter(yamlMessageConverter); return this; } @Override - public ClientBuilder customMessageConverter(HttpMessageConverter customConverter) { + public ClientBuilder addCustomConverter(HttpMessageConverter customConverter) { addCustomMessageConverter(customConverter); return this; } @@ -391,20 +391,21 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { this.resourceMessageConverter = new ResourceHttpMessageConverter(false); detectMessageConverters(); } - List> allConverters = new ArrayList<>(); - List> partConverters = new ArrayList<>(); - partConverters.addAll(this.getCustomConverters()); - partConverters.addAll(this.getCoreConverters()); - - allConverters.addAll(this.getCustomConverters()); - allConverters.addAll(this.getBaseConverters()); - if (this.resourceMessageConverter != null) { - allConverters.add(this.resourceMessageConverter); + List> partConverters = new ArrayList<>(this.getCustomConverters()); + List> allConverters = new ArrayList<>(this.getCustomConverters()); + if (this.registerDefaults) { + partConverters.addAll(this.getCoreConverters()); + allConverters.addAll(this.getBaseConverters()); + if (this.resourceMessageConverter != null) { + allConverters.add(this.resourceMessageConverter); + } } if (!partConverters.isEmpty() || !allConverters.isEmpty()) { allConverters.add(new AllEncompassingFormHttpMessageConverter(partConverters)); } - allConverters.addAll(this.getCoreConverters()); + if (this.registerDefaults) { + allConverters.addAll(this.getCoreConverters()); + } if (this.configurer != null) { allConverters.forEach(this.configurer); } @@ -422,43 +423,43 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { } @Override - public ServerBuilder stringMessageConverter(HttpMessageConverter stringMessageConverter) { + public ServerBuilder withStringConverter(HttpMessageConverter stringMessageConverter) { setStringMessageConverter(stringMessageConverter); return this; } @Override - public ServerBuilder jsonMessageConverter(HttpMessageConverter jsonMessageConverter) { + public ServerBuilder withJsonConverter(HttpMessageConverter jsonMessageConverter) { setJsonMessageConverter(jsonMessageConverter); return this; } @Override - public ServerBuilder xmlMessageConverter(HttpMessageConverter xmlMessageConverter) { + public ServerBuilder withXmlConverter(HttpMessageConverter xmlMessageConverter) { setXmlMessageConverter(xmlMessageConverter); return this; } @Override - public ServerBuilder smileMessageConverter(HttpMessageConverter smileMessageConverter) { + public ServerBuilder withSmileConverter(HttpMessageConverter smileMessageConverter) { setSmileMessageConverter(smileMessageConverter); return this; } @Override - public ServerBuilder cborMessageConverter(HttpMessageConverter cborMessageConverter) { + public ServerBuilder withCborConverter(HttpMessageConverter cborMessageConverter) { setCborMessageConverter(cborMessageConverter); return this; } @Override - public ServerBuilder yamlMessageConverter(HttpMessageConverter yamlMessageConverter) { + public ServerBuilder withYamlConverter(HttpMessageConverter yamlMessageConverter) { setYamlMessageConverter(yamlMessageConverter); return this; } @Override - public ServerBuilder customMessageConverter(HttpMessageConverter customConverter) { + public ServerBuilder addCustomConverter(HttpMessageConverter customConverter) { addCustomMessageConverter(customConverter); return this; } @@ -476,24 +477,24 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { this.resourceRegionMessageConverter = new ResourceRegionHttpMessageConverter(); detectMessageConverters(); } - List> allConverters = new ArrayList<>(); - List> partConverters = new ArrayList<>(); - - partConverters.addAll(this.getCustomConverters()); - partConverters.addAll(this.getCoreConverters()); - - allConverters.addAll(this.getCustomConverters()); - allConverters.addAll(this.getBaseConverters()); - if (this.resourceMessageConverter != null) { - allConverters.add(this.resourceMessageConverter); - } - if (this.resourceRegionMessageConverter != null) { - allConverters.add(this.resourceRegionMessageConverter); + List> partConverters = new ArrayList<>(this.getCustomConverters()); + List> allConverters = new ArrayList<>(this.getCustomConverters()); + if (this.registerDefaults) { + partConverters.addAll(this.getCoreConverters()); + allConverters.addAll(this.getBaseConverters()); + 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()); + if (this.registerDefaults) { + allConverters.addAll(this.getCoreConverters()); + } if (this.configurer != null) { allConverters.forEach(this.configurer); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java index 3daf7aef745..42d8b9797b7 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java @@ -21,8 +21,10 @@ import java.util.function.Consumer; /** * Utility for building and configuring an immutable collection of {@link HttpMessageConverter} * instances for {@link #forClient() client} or {@link #forServer() server} usage. You can - * ask to {@link Builder#registerDefaults() register default converters with classpath detection}, - * add custom converters and post-process configured converters. + * ask to {@link Builder#registerDefaults() register default converters with classpath detection} + * and {@link Builder#withJsonConverter(HttpMessageConverter) override specific converters} that were detected. + * Custom converters can be independently added in front of default ones. + * Finally, {@link Builder#configureMessageConverters(Consumer) default and custom converters can be configured}. * * @author Brian Clozel * @since 7.0 @@ -79,7 +81,7 @@ public interface HttpMessageConverters extends Iterable> /** * Register default converters using classpath detection. - * Manual registrations like {@link #jsonMessageConverter(HttpMessageConverter)} will + * Manual registrations like {@link #withJsonConverter(HttpMessageConverter)} will * override auto-detected ones. */ T registerDefaults(); @@ -90,7 +92,7 @@ public interface HttpMessageConverters extends Iterable> * @param stringMessageConverter the converter instance to use * @see StringHttpMessageConverter */ - T stringMessageConverter(HttpMessageConverter stringMessageConverter); + T withStringConverter(HttpMessageConverter stringMessageConverter); /** * Override the default Jackson 3.x JSON {@code HttpMessageConverter} @@ -98,7 +100,7 @@ public interface HttpMessageConverters extends Iterable> * @param jsonMessageConverter the converter instance to use * @see org.springframework.http.converter.json.JacksonJsonHttpMessageConverter */ - T jsonMessageConverter(HttpMessageConverter jsonMessageConverter); + T withJsonConverter(HttpMessageConverter jsonMessageConverter); /** * Override the default Jackson 3.x XML {@code HttpMessageConverter} @@ -106,7 +108,7 @@ public interface HttpMessageConverters extends Iterable> * @param xmlMessageConverter the converter instance to use * @see org.springframework.http.converter.xml.JacksonXmlHttpMessageConverter */ - T xmlMessageConverter(HttpMessageConverter xmlMessageConverter); + T withXmlConverter(HttpMessageConverter xmlMessageConverter); /** * Override the default Jackson 3.x Smile {@code HttpMessageConverter} @@ -114,7 +116,7 @@ public interface HttpMessageConverters extends Iterable> * @param smileMessageConverter the converter instance to use * @see org.springframework.http.converter.smile.JacksonSmileHttpMessageConverter */ - T smileMessageConverter(HttpMessageConverter smileMessageConverter); + T withSmileConverter(HttpMessageConverter smileMessageConverter); /** * Override the default Jackson 3.x CBOR {@code HttpMessageConverter} @@ -122,7 +124,7 @@ public interface HttpMessageConverters extends Iterable> * @param cborMessageConverter the converter instance to use * @see org.springframework.http.converter.cbor.JacksonCborHttpMessageConverter */ - T cborMessageConverter(HttpMessageConverter cborMessageConverter); + T withCborConverter(HttpMessageConverter cborMessageConverter); /** * Override the default Jackson 3.x Yaml {@code HttpMessageConverter} @@ -130,13 +132,13 @@ public interface HttpMessageConverters extends Iterable> * @param yamlMessageConverter the converter instance to use * @see org.springframework.http.converter.yaml.JacksonYamlHttpMessageConverter */ - T yamlMessageConverter(HttpMessageConverter yamlMessageConverter); + T withYamlConverter(HttpMessageConverter yamlMessageConverter); /** - * Add a custom {@code HttpMessageConverter} to the list of converters. + * Add a custom {@code HttpMessageConverter} to the list of converters, ahead of the default converters. * @param customConverter the converter instance to add */ - T customMessageConverter(HttpMessageConverter customConverter); + T addCustomConverter(HttpMessageConverter customConverter); /** * Add a consumer for configuring the selected message converters. diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java index 94300c7fe1d..9df03025e8b 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java @@ -498,7 +498,7 @@ final class DefaultRestClientBuilder implements RestClient.Builder { } else { if (this.messageConverters != null) { - this.messageConverters.forEach(builder::customMessageConverter); + this.messageConverters.forEach(builder::addCustomConverter); } if (this.convertersConfigurer != null) { this.convertersConfigurer.accept(builder); 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 042ef780eb2..eb6eb465e8b 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 @@ -62,42 +62,42 @@ class DefaultHttpMessageConvertersTests { @Test void failsWhenStringConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().stringMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withStringConverter(new CustomHttpMessageConverter()).build()) .withMessage("stringMessageConverter should support 'text/plain'"); } @Test void failsWhenJsonConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().jsonMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withJsonConverter(new CustomHttpMessageConverter()).build()) .withMessage("jsonMessageConverter should support 'application/json'"); } @Test void failsWhenXmlConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().xmlMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withXmlConverter(new CustomHttpMessageConverter()).build()) .withMessage("xmlMessageConverter should support 'text/xml'"); } @Test void failsWhenSmileConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().smileMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withSmileConverter(new CustomHttpMessageConverter()).build()) .withMessage("smileMessageConverter should support 'application/x-jackson-smile'"); } @Test void failsWhenCborConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().cborMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withCborConverter(new CustomHttpMessageConverter()).build()) .withMessage("cborMessageConverter should support 'application/cbor'"); } @Test void failsWhenYamlConverterDoesNotSupportMediaType() { assertThatIllegalArgumentException() - .isThrownBy(() -> HttpMessageConverters.forClient().yamlMessageConverter(new CustomHttpMessageConverter()).build()) + .isThrownBy(() -> HttpMessageConverters.forClient().withYamlConverter(new CustomHttpMessageConverter()).build()) .withMessage("yamlMessageConverter should support 'application/yaml'"); } @@ -134,14 +134,14 @@ class DefaultHttpMessageConvertersTests { @Test void registerCustomMessageConverter() { var converters = HttpMessageConverters.forClient() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); } @Test void registerCustomMessageConverterAheadOfDefaults() { var converters = HttpMessageConverters.forClient().registerDefaults() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); assertThat(converters).hasExactlyElementsOfTypes( CustomHttpMessageConverter.class, ByteArrayHttpMessageConverter.class, StringHttpMessageConverter.class, ResourceHttpMessageConverter.class, @@ -155,23 +155,23 @@ class DefaultHttpMessageConvertersTests { @Test void registerCustomConverterInMultipartConverter() { var converters = HttpMessageConverters.forClient().registerDefaults() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); var multipartConverter = findMessageConverter(AllEncompassingFormHttpMessageConverter.class, converters); assertThat(multipartConverter.getPartConverters()).hasAtLeastOneElementOfType(CustomHttpMessageConverter.class); } @Test - void registerMultipartConverterWhenOtherConvertersPresent() { - var converters = HttpMessageConverters.forClient() - .stringMessageConverter(new StringHttpMessageConverter()).build(); - assertThat(converters).hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + void shouldNotConfigureOverridesWhenDefaultOff() { + var stringConverter = new StringHttpMessageConverter(); + var converters = HttpMessageConverters.forClient().withStringConverter(stringConverter).build(); + assertThat(converters).isEmpty(); } @Test void shouldUseSpecificConverter() { var jacksonConverter = new JacksonJsonHttpMessageConverter(); var converters = HttpMessageConverters.forClient().registerDefaults() - .jsonMessageConverter(jacksonConverter).build(); + .withJsonConverter(jacksonConverter).build(); var customConverter = findMessageConverter(JacksonJsonHttpMessageConverter.class, converters); assertThat(customConverter).isEqualTo(jacksonConverter); @@ -181,7 +181,7 @@ class DefaultHttpMessageConvertersTests { void shouldOverrideStringConverters() { var stringConverter = new StringHttpMessageConverter(); var converters = HttpMessageConverters.forClient().registerDefaults() - .stringMessageConverter(stringConverter).build(); + .withStringConverter(stringConverter).build(); var actualConverter = findMessageConverter(StringHttpMessageConverter.class, converters); assertThat(actualConverter).isEqualTo(stringConverter); @@ -191,7 +191,7 @@ class DefaultHttpMessageConvertersTests { void shouldConfigureConverter() { var customConverter = new CustomHttpMessageConverter(); HttpMessageConverters.forClient() - .customMessageConverter(customConverter) + .addCustomConverter(customConverter) .configureMessageConverters(converter -> { if (converter instanceof CustomHttpMessageConverter custom) { custom.processed = true; @@ -237,14 +237,14 @@ class DefaultHttpMessageConvertersTests { @Test void registerCustomMessageConverter() { var converters = HttpMessageConverters.forServer() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); assertThat(converters).hasExactlyElementsOfTypes(CustomHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); } @Test void registerCustomMessageConverterAheadOfDefaults() { var converters = HttpMessageConverters.forServer().registerDefaults() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); assertThat(converters).hasExactlyElementsOfTypes( CustomHttpMessageConverter.class, ByteArrayHttpMessageConverter.class, StringHttpMessageConverter.class, @@ -259,23 +259,24 @@ class DefaultHttpMessageConvertersTests { @Test void registerCustomConverterInMultipartConverter() { var converters = HttpMessageConverters.forServer().registerDefaults() - .customMessageConverter(new CustomHttpMessageConverter()).build(); + .addCustomConverter(new CustomHttpMessageConverter()).build(); var multipartConverter = findMessageConverter(AllEncompassingFormHttpMessageConverter.class, converters); assertThat(multipartConverter.getPartConverters()).hasAtLeastOneElementOfType(CustomHttpMessageConverter.class); } + @Test - void registerMultipartConverterWhenOtherConvertersPresent() { - var converters = HttpMessageConverters.forServer() - .stringMessageConverter(new StringHttpMessageConverter()).build(); - assertThat(converters).hasExactlyElementsOfTypes(StringHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class); + void shouldNotConfigureOverridesWhenDefaultOff() { + var stringConverter = new StringHttpMessageConverter(); + var converters = HttpMessageConverters.forServer().withStringConverter(stringConverter).build(); + assertThat(converters).isEmpty(); } @Test void shouldUseSpecificConverter() { var jacksonConverter = new JacksonJsonHttpMessageConverter(); var converters = HttpMessageConverters.forServer().registerDefaults() - .jsonMessageConverter(jacksonConverter).build(); + .withJsonConverter(jacksonConverter).build(); var customConverter = findMessageConverter(JacksonJsonHttpMessageConverter.class, converters); assertThat(customConverter).isEqualTo(jacksonConverter); @@ -286,7 +287,7 @@ class DefaultHttpMessageConvertersTests { void shouldOverrideStringConverters() { var stringConverter = new StringHttpMessageConverter(); var converters = HttpMessageConverters.forServer().registerDefaults() - .stringMessageConverter(stringConverter).build(); + .withStringConverter(stringConverter).build(); var actualConverter = findMessageConverter(StringHttpMessageConverter.class, converters); assertThat(actualConverter).isEqualTo(stringConverter); @@ -296,7 +297,7 @@ class DefaultHttpMessageConvertersTests { void shouldConfigureConverter() { var customConverter = new CustomHttpMessageConverter(); HttpMessageConverters.forServer().registerDefaults() - .customMessageConverter(customConverter) + .addCustomConverter(customConverter) .configureMessageConverters(converter -> { if (converter instanceof CustomHttpMessageConverter custom) { custom.processed = true; 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 6ead666d005..7dda5d1a746 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 @@ -148,7 +148,7 @@ public class RestClientBuilderTests { void configureMessageConverters() { StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); RestClient.Builder builder = RestClient.builder(); - builder.configureMessageConverters(clientBuilder -> clientBuilder.stringMessageConverter(stringConverter)); + builder.configureMessageConverters(clientBuilder -> clientBuilder.addCustomConverter(stringConverter)); assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class); DefaultRestClient restClient = (DefaultRestClient) builder.build(); diff --git a/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java b/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java index cc54ae352e8..acf97f5b5c8 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java @@ -82,7 +82,7 @@ class RestClientObservationTests { RestClient.Builder createBuilder() { return RestClient.builder() .baseUrl("https://example.com/base") - .configureMessageConverters(converters -> converters.customMessageConverter(new StringHttpMessageConverter())) + .configureMessageConverters(converters -> converters.addCustomConverter(new StringHttpMessageConverter())) .requestFactory(this.requestFactory) .observationRegistry(this.observationRegistry); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java index 152ca800735..285c2f7d547 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java @@ -127,7 +127,7 @@ public class DelegatingWebMvcConfigurationTests { @Override public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) { - builder.customMessageConverter(customConverter); + builder.addCustomConverter(customConverter); } }; webMvcConfig.setConfigurers(Collections.singletonList(configurer)); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java index aaa55448b03..7fd1a9ed6c4 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java @@ -212,9 +212,9 @@ class WebMvcConfigurationSupportExtensionTests { List> converters = adapter.getMessageConverters(); assertThat(converters).hasSize(3); assertThat(converters.get(0).getClass()).isEqualTo(StringHttpMessageConverter.class); - assertThat(converters.get(1).getClass()).isEqualTo(AllEncompassingFormHttpMessageConverter.class); - assertThat(converters.get(2).getClass()).isEqualTo(JacksonJsonHttpMessageConverter.class); - JsonMapper jsonMapper = ((JacksonJsonHttpMessageConverter) converters.get(2)).getMapper(); + assertThat(converters.get(1).getClass()).isEqualTo(JacksonJsonHttpMessageConverter.class); + assertThat(converters.get(2).getClass()).isEqualTo(AllEncompassingFormHttpMessageConverter.class); + JsonMapper jsonMapper = ((JacksonJsonHttpMessageConverter) converters.get(1)).getMapper(); assertThat(jsonMapper.deserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse(); assertThat(jsonMapper.deserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)).isFalse(); assertThat(jsonMapper.serializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse(); @@ -356,7 +356,7 @@ class WebMvcConfigurationSupportExtensionTests { @Override protected HttpMessageConverters createMessageConverters() { - return HttpMessageConverters.forServer().jsonMessageConverter(new JacksonJsonHttpMessageConverter()).build(); + return HttpMessageConverters.forServer().addCustomConverter(new JacksonJsonHttpMessageConverter()).build(); } @Override