From b8d9dee7bee37d4e2eb0afad95aacc4b8c981027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= <141109+sdeleuze@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:39:32 +0100 Subject: [PATCH] Refine Kotlin serialization converters/codecs conditions This commit is a follow-up of 34410 to refine the activation conditions of Kotlin serialization converters/codecs. Closes gh-34438 --- .../http/codec/support/BaseDefaultCodecs.java | 4 ---- .../AllEncompassingFormHttpMessageConverter.java | 15 +++++++-------- .../web/client/DefaultRestClientBuilder.java | 6 +++--- .../springframework/web/client/RestTemplate.java | 6 +++--- .../web/client/RestTemplateTests.java | 8 +++++--- .../annotation/WebMvcConfigurationSupport.java | 6 +++--- .../WebMvcConfigurationSupportTests.java | 2 +- 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java b/spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java index 50c532dec2..da3c5da99e 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java +++ b/spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java @@ -411,10 +411,6 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs, CodecConfigure addCodec(this.typedReaders, new DecoderHttpMessageReader<>(this.protobufDecoder != null ? (ProtobufDecoder) this.protobufDecoder : new ProtobufDecoder())); } - else if (kotlinSerializationProtobufPresent) { - addCodec(this.typedReaders, new DecoderHttpMessageReader<>(this.kotlinSerializationProtobufDecoder != null ? - (KotlinSerializationProtobufDecoder) this.kotlinSerializationProtobufDecoder : new KotlinSerializationProtobufDecoder())); - } addCodec(this.typedReaders, new FormHttpMessageReader()); if (this.multipartReader != null) { addCodec(this.typedReaders, this.multipartReader); diff --git a/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java index 7f4b4a9525..31053bfe17 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,9 +87,6 @@ public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConv addPartConverter(new Jaxb2RootElementHttpMessageConverter()); } - if (kotlinSerializationJsonPresent) { - addPartConverter(new KotlinSerializationJsonHttpMessageConverter()); - } if (jackson2Present) { addPartConverter(new MappingJackson2HttpMessageConverter()); } @@ -99,6 +96,9 @@ public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConv else if (jsonbPresent) { addPartConverter(new JsonbHttpMessageConverter()); } + else if (kotlinSerializationJsonPresent) { + addPartConverter(new KotlinSerializationJsonHttpMessageConverter()); + } if (jackson2XmlPresent) { addPartConverter(new MappingJackson2XmlHttpMessageConverter()); @@ -111,15 +111,14 @@ public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConv if (jackson2CborPresent) { addPartConverter(new MappingJackson2CborHttpMessageConverter()); } + else if (kotlinSerializationCborPresent) { + addPartConverter(new KotlinSerializationCborHttpMessageConverter()); + } if (jackson2YamlPresent) { addPartConverter(new MappingJackson2YamlHttpMessageConverter()); } - if (kotlinSerializationCborPresent) { - addPartConverter(new KotlinSerializationCborHttpMessageConverter()); - } - if (kotlinSerializationProtobufPresent) { addPartConverter(new KotlinSerializationProtobufHttpMessageConverter()); } diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java index 597a7b2074..952f846640 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClientBuilder.java @@ -419,9 +419,6 @@ final class DefaultRestClientBuilder implements RestClient.Builder { this.messageConverters.add(new ResourceHttpMessageConverter(false)); this.messageConverters.add(new AllEncompassingFormHttpMessageConverter()); - if (kotlinSerializationJsonPresent) { - this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter()); - } if (jackson2Present) { this.messageConverters.add(new MappingJackson2HttpMessageConverter()); } @@ -431,6 +428,9 @@ final class DefaultRestClientBuilder implements RestClient.Builder { else if (jsonbPresent) { this.messageConverters.add(new JsonbHttpMessageConverter()); } + else if (kotlinSerializationJsonPresent) { + this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter()); + } if (jackson2SmilePresent) { this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter()); } diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 22f5fdacf5..f58c364884 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -204,9 +204,6 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat this.messageConverters.add(new KotlinSerializationProtobufHttpMessageConverter()); } - if (kotlinSerializationJsonPresent) { - this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter()); - } if (jackson2Present) { this.messageConverters.add(new MappingJackson2HttpMessageConverter()); } @@ -216,6 +213,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat else if (jsonbPresent) { this.messageConverters.add(new JsonbHttpMessageConverter()); } + else if (kotlinSerializationJsonPresent) { + this.messageConverters.add(new KotlinSerializationJsonHttpMessageConverter()); + } if (jackson2SmilePresent) { this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter()); diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java index b9cbab2a00..fcf750abd2 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java @@ -108,14 +108,16 @@ class RestTemplateTests { template.setErrorHandler(errorHandler); } - @Test // gh-29008 - void defaultMessageConvertersWithKotlinSerialization() { + @Test + void defaultMessageConvertersWithoutKotlinSerialization() { RestTemplate restTemplate = new RestTemplate(); List> httpMessageConverters = restTemplate.getMessageConverters(); assertThat(httpMessageConverters).extracting("class").containsOnlyOnce( - KotlinSerializationJsonHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class ); + assertThat(httpMessageConverters).extracting("class").doesNotContain( + KotlinSerializationJsonHttpMessageConverter.class + ); } @Test diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index 8da9e517c7..14afae7a49 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -891,9 +891,6 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } - if (kotlinSerializationCborPresent) { - messageConverters.add(new KotlinSerializationCborHttpMessageConverter()); - } if (kotlinSerializationProtobufPresent) { messageConverters.add(new KotlinSerializationProtobufHttpMessageConverter()); } @@ -929,6 +926,9 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv } messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build())); } + else if (kotlinSerializationCborPresent) { + messageConverters.add(new KotlinSerializationCborHttpMessageConverter()); + } if (jackson2YamlPresent) { Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.yaml(); if (this.applicationContext != null) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java index 1d59476e0f..a10ca420e6 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java @@ -172,7 +172,7 @@ class WebMvcConfigurationSupportTests { ApplicationContext context = initContext(WebConfig.class); RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class); List> converters = adapter.getMessageConverters(); - assertThat(converters).hasSizeGreaterThanOrEqualTo(14); + assertThat(converters).hasSizeGreaterThanOrEqualTo(13); converters.stream() .filter(AbstractJackson2HttpMessageConverter.class::isInstance) .forEach(converter -> {