diff --git a/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultClientHttpMessageConvertersCustomizer.java b/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultClientHttpMessageConvertersCustomizer.java index 83c5103d8a8..ed1185a184c 100644 --- a/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultClientHttpMessageConvertersCustomizer.java +++ b/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultClientHttpMessageConvertersCustomizer.java @@ -54,9 +54,12 @@ class DefaultClientHttpMessageConvertersCustomizer implements ClientHttpMessageC else if (converter instanceof KotlinSerializationJsonHttpMessageConverter) { builder.withKotlinSerializationJsonConverter(converter); } - else if (converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_JSON)) { + else if (supportsMediaType(converter, MediaType.APPLICATION_JSON)) { builder.withJsonConverter(converter); } + else if (supportsMediaType(converter, MediaType.APPLICATION_XML)) { + builder.withXmlConverter(converter); + } else { builder.addCustomConverter(converter); } @@ -64,4 +67,13 @@ class DefaultClientHttpMessageConvertersCustomizer implements ClientHttpMessageC } } + private static boolean supportsMediaType(HttpMessageConverter converter, MediaType mediaType) { + for (MediaType supportedMediaType : converter.getSupportedMediaTypes()) { + if (supportedMediaType.equalsTypeAndSubtype(mediaType)) { + return true; + } + } + return false; + } + } diff --git a/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultServerHttpMessageConvertersCustomizer.java b/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultServerHttpMessageConvertersCustomizer.java index dbc1f2a72d5..2f4eed708cb 100644 --- a/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultServerHttpMessageConvertersCustomizer.java +++ b/module/spring-boot-http-converter/src/main/java/org/springframework/boot/http/converter/autoconfigure/DefaultServerHttpMessageConvertersCustomizer.java @@ -52,11 +52,14 @@ class DefaultServerHttpMessageConvertersCustomizer implements ServerHttpMessageC builder.withStringConverter(converter); } else if (converter instanceof KotlinSerializationJsonHttpMessageConverter) { - builder.addCustomConverter(converter); + builder.withKotlinSerializationJsonConverter(converter); } - else if (converter.getSupportedMediaTypes().contains(MediaType.APPLICATION_JSON)) { + else if (supportsMediaType(converter, MediaType.APPLICATION_JSON)) { builder.withJsonConverter(converter); } + else if (supportsMediaType(converter, MediaType.APPLICATION_XML)) { + builder.withXmlConverter(converter); + } else { builder.addCustomConverter(converter); } @@ -64,4 +67,13 @@ class DefaultServerHttpMessageConvertersCustomizer implements ServerHttpMessageC } } + private static boolean supportsMediaType(HttpMessageConverter converter, MediaType mediaType) { + for (MediaType supportedMediaType : converter.getSupportedMediaTypes()) { + if (supportedMediaType.equalsTypeAndSubtype(mediaType)) { + return true; + } + } + return false; + } + } diff --git a/module/spring-boot-http-converter/src/test/java/org/springframework/boot/http/converter/autoconfigure/HttpMessageConvertersAutoConfigurationTests.java b/module/spring-boot-http-converter/src/test/java/org/springframework/boot/http/converter/autoconfigure/HttpMessageConvertersAutoConfigurationTests.java index 77b1e89806d..ce02ad958f9 100644 --- a/module/spring-boot-http-converter/src/test/java/org/springframework/boot/http/converter/autoconfigure/HttpMessageConvertersAutoConfigurationTests.java +++ b/module/spring-boot-http-converter/src/test/java/org/springframework/boot/http/converter/autoconfigure/HttpMessageConvertersAutoConfigurationTests.java @@ -418,13 +418,17 @@ class HttpMessageConvertersAutoConfigurationTests { .getBean(ClientHttpMessageConvertersCustomizer.class); ClientBuilder clientBuilder = HttpMessageConverters.forClient().registerDefaults(); clientCustomizer.customize(clientBuilder); - assertThat(clientBuilder.build()).contains(converter); + HttpMessageConverters clientConverters = clientBuilder.build(); + assertThat(clientConverters).contains(converter); + assertThat(clientConverters).filteredOn((c) -> type.isAssignableFrom(c.getClass())).hasSize(1); ServerHttpMessageConvertersCustomizer serverCustomizer = context .getBean(ServerHttpMessageConvertersCustomizer.class); ServerBuilder serverBuilder = HttpMessageConverters.forServer().registerDefaults(); serverCustomizer.customize(serverBuilder); - assertThat(serverBuilder.build()).contains(converter); + HttpMessageConverters serverConverters = serverBuilder.build(); + assertThat(serverConverters).contains(converter); + assertThat(serverConverters).filteredOn((c) -> type.isAssignableFrom(c.getClass())).hasSize(1); } private void assertConvertersBeanRegisteredWithHttpMessageConverters(AssertableApplicationContext context,