Skip to content

Commit 44f0c77

Browse files
committed
Configure JSON and XML converters on HttpMessageConverters
This commit ensures that XML and JSON converters on both client and server are configured using the dedicated methods on `HttpMessageConverters`, instead of pushing them ahead of default converters. Closes gh-47917 Fixes gh-48096
1 parent edd530c commit 44f0c77

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultClientHttpMessageConvertersCustomizer.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,26 @@ public void customize(ClientBuilder builder) {
5454
else if (converter instanceof KotlinSerializationJsonHttpMessageConverter) {
5555
builder.withKotlinSerializationJsonConverter(converter);
5656
}
57-
else if (converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_JSON)) {
57+
else if (supportsMediaType(converter, MediaType.APPLICATION_JSON)) {
5858
builder.withJsonConverter(converter);
5959
}
60+
else if (supportsMediaType(converter, MediaType.APPLICATION_XML)) {
61+
builder.withXmlConverter(converter);
62+
}
6063
else {
6164
builder.addCustomConverter(converter);
6265
}
6366
});
6467
}
6568
}
6669

70+
private static boolean supportsMediaType(HttpMessageConverter<?> converter, MediaType mediaType) {
71+
for (MediaType supportedMediaType : converter.getSupportedMediaTypes()) {
72+
if (supportedMediaType.equalsTypeAndSubtype(mediaType)) {
73+
return true;
74+
}
75+
}
76+
return false;
77+
}
78+
6779
}

module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultServerHttpMessageConvertersCustomizer.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,28 @@ public void customize(ServerBuilder builder) {
5252
builder.withStringConverter(converter);
5353
}
5454
else if (converter instanceof KotlinSerializationJsonHttpMessageConverter) {
55-
builder.addCustomConverter(converter);
55+
builder.withKotlinSerializationJsonConverter(converter);
5656
}
57-
else if (converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_JSON)) {
57+
else if (supportsMediaType(converter, MediaType.APPLICATION_JSON)) {
5858
builder.withJsonConverter(converter);
5959
}
60+
else if (supportsMediaType(converter, MediaType.APPLICATION_XML)) {
61+
builder.withXmlConverter(converter);
62+
}
6063
else {
6164
builder.addCustomConverter(converter);
6265
}
6366
});
6467
}
6568
}
6669

70+
private static boolean supportsMediaType(HttpMessageConverter<?> converter, MediaType mediaType) {
71+
for (MediaType supportedMediaType : converter.getSupportedMediaTypes()) {
72+
if (supportedMediaType.equalsTypeAndSubtype(mediaType)) {
73+
return true;
74+
}
75+
}
76+
return false;
77+
}
78+
6779
}

module/spring-boot-http-converter/src/test/java/org/springframework/boot/http/converter/autoconfigure/HttpMessageConvertersAutoConfigurationTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,13 +418,17 @@ private void assertConverterBeanRegisteredWithHttpMessageConverters(AssertableAp
418418
.getBean(ClientHttpMessageConvertersCustomizer.class);
419419
ClientBuilder clientBuilder = HttpMessageConverters.forClient().registerDefaults();
420420
clientCustomizer.customize(clientBuilder);
421-
assertThat(clientBuilder.build()).contains(converter);
421+
HttpMessageConverters clientConverters = clientBuilder.build();
422+
assertThat(clientConverters).contains(converter);
423+
assertThat(clientConverters).filteredOn((c) -> type.isAssignableFrom(c.getClass())).hasSize(1);
422424

423425
ServerHttpMessageConvertersCustomizer serverCustomizer = context
424426
.getBean(ServerHttpMessageConvertersCustomizer.class);
425427
ServerBuilder serverBuilder = HttpMessageConverters.forServer().registerDefaults();
426428
serverCustomizer.customize(serverBuilder);
427-
assertThat(serverBuilder.build()).contains(converter);
429+
HttpMessageConverters serverConverters = serverBuilder.build();
430+
assertThat(serverConverters).contains(converter);
431+
assertThat(serverConverters).filteredOn((c) -> type.isAssignableFrom(c.getClass())).hasSize(1);
428432
}
429433

430434
private void assertConvertersBeanRegisteredWithHttpMessageConverters(AssertableApplicationContext context,

0 commit comments

Comments
 (0)