mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-10-10 00:59:01 +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:
+2
-2
@@ -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[]
|
||||
|
||||
+2
-2
@@ -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[]
|
||||
+39
-38
@@ -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<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 {
|
||||
}
|
||||
|
||||
@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<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);
|
||||
}
|
||||
|
||||
+13
-11
@@ -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<?>>
|
||||
|
||||
/**
|
||||
* 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<?>>
|
||||
* @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<?>>
|
||||
* @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<?>>
|
||||
* @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<?>>
|
||||
* @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<?>>
|
||||
* @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<?>>
|
||||
* @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.
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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));
|
||||
|
||||
+4
-4
@@ -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 {
|
||||
|
||||
@Override
|
||||
protected HttpMessageConverters createMessageConverters() {
|
||||
return HttpMessageConverters.forServer().jsonMessageConverter(new JacksonJsonHttpMessageConverter()).build();
|
||||
return HttpMessageConverters.forServer().addCustomConverter(new JacksonJsonHttpMessageConverter()).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user