mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
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
This commit is contained in:
+27
-26
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user