Browse Source

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
pull/35738/head
Brian Clozel 2 months ago
parent
commit
af026c0373
  1. 4
      framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java
  2. 4
      framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt
  3. 77
      spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java
  4. 24
      spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java
  5. 2
      spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java
  6. 53
      spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java
  7. 2
      spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java
  8. 2
      spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java
  9. 2
      spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java
  10. 8
      spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java

4
framework-docs/src/main/java/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.java

@ -44,8 +44,8 @@ public class WebConfiguration implements WebMvcConfigurer { @@ -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[]

4
framework-docs/src/main/kotlin/org/springframework/docs/web/webmvc/mvcconfig/mvcconfigmessageconverters/WebConfiguration.kt

@ -26,8 +26,8 @@ class WebConfiguration : WebMvcConfigurer { @@ -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[]

77
spring-web/src/main/java/org/springframework/http/converter/DefaultHttpMessageConverters.java

@ -338,43 +338,43 @@ class DefaultHttpMessageConverters implements HttpMessageConverters { @@ -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 { @@ -391,20 +391,21 @@ class DefaultHttpMessageConverters implements HttpMessageConverters {
this.resourceMessageConverter = new ResourceHttpMessageConverter(false);
detectMessageConverters();
}
List<HttpMessageConverter<?>> allConverters = new ArrayList<>();
List<HttpMessageConverter<?>> 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<HttpMessageConverter<?>> partConverters = new ArrayList<>(this.getCustomConverters());
List<HttpMessageConverter<?>> 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 { @@ -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 { @@ -476,24 +477,24 @@ class DefaultHttpMessageConverters implements HttpMessageConverters {
this.resourceRegionMessageConverter = new ResourceRegionHttpMessageConverter();
detectMessageConverters();
}
List<HttpMessageConverter<?>> allConverters = new ArrayList<>();
List<HttpMessageConverter<?>> 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<HttpMessageConverter<?>> partConverters = new ArrayList<>(this.getCustomConverters());
List<HttpMessageConverter<?>> 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);
}

24
spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverters.java

@ -21,8 +21,10 @@ import java.util.function.Consumer; @@ -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<HttpMessageConverter<?>> @@ -79,7 +81,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
/**
* 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<HttpMessageConverter<?>> @@ -90,7 +92,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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<HttpMessageConverter<?>> @@ -98,7 +100,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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<HttpMessageConverter<?>> @@ -106,7 +108,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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<HttpMessageConverter<?>> @@ -114,7 +116,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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<HttpMessageConverter<?>> @@ -122,7 +124,7 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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<HttpMessageConverter<?>> @@ -130,13 +132,13 @@ public interface HttpMessageConverters extends Iterable<HttpMessageConverter<?>>
* @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.

2
spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java

@ -498,7 +498,7 @@ final class DefaultRestClientBuilder implements RestClient.Builder { @@ -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);

53
spring-web/src/test/java/org/springframework/http/converter/DefaultHttpMessageConvertersTests.java

@ -62,42 +62,42 @@ class DefaultHttpMessageConvertersTests { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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;

2
spring-web/src/test/java/org/springframework/web/client/RestClientBuilderTests.java

@ -148,7 +148,7 @@ public class RestClientBuilderTests { @@ -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();

2
spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java

@ -82,7 +82,7 @@ class RestClientObservationTests { @@ -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);
}

2
spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java

@ -127,7 +127,7 @@ public class DelegatingWebMvcConfigurationTests { @@ -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));

8
spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java

@ -212,9 +212,9 @@ class WebMvcConfigurationSupportExtensionTests { @@ -212,9 +212,9 @@ class WebMvcConfigurationSupportExtensionTests {
List<HttpMessageConverter<?>> 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 { @@ -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

Loading…
Cancel
Save