From 42ab1b75e747706b3ddc175ab6ca27276901b5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 26 Sep 2022 09:53:30 +0200 Subject: [PATCH] Fix a regression in Kotlin serialization support After gh-29068, some Type instances can throw an IllegalArgumentException. This commit catches them properly to just return a null serializer in that case. Closes gh-29192 --- .../http/codec/json/KotlinSerializationJsonDecoder.java | 6 +++++- .../http/codec/json/KotlinSerializationJsonEncoder.java | 6 +++++- .../json/KotlinSerializationJsonHttpMessageConverter.java | 6 +++++- .../http/codec/json/KotlinSerializationJsonDecoderTests.kt | 1 + .../http/codec/json/KotlinSerializationJsonEncoderTests.kt | 1 + .../KotlinSerializationJsonHttpMessageConverterTests.kt | 5 +++++ 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java index 6ecec5a76ff..06094776e54 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java @@ -133,7 +133,11 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder { private KSerializer serializer(Type type) { KSerializer serializer = serializerCache.get(type); if (serializer == null) { - serializer = SerializersKt.serializerOrNull(type); + try { + serializer = SerializersKt.serializerOrNull(type); + } + catch (IllegalArgumentException ignored) { + } if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) { return null; } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java index 667ff4c5a2f..ef5e0ac4923 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java @@ -121,7 +121,11 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder { private KSerializer serializer(Type type) { KSerializer serializer = serializerCache.get(type); if (serializer == null) { - serializer = SerializersKt.serializerOrNull(type); + try { + serializer = SerializersKt.serializerOrNull(type); + } + catch (IllegalArgumentException ignored) { + } if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) { return null; } diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java index a5fc349716f..39ad1484a94 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/KotlinSerializationJsonHttpMessageConverter.java @@ -173,7 +173,11 @@ public class KotlinSerializationJsonHttpMessageConverter extends AbstractGeneric private KSerializer serializer(Type type) { KSerializer serializer = serializerCache.get(type); if (serializer == null) { - serializer = SerializersKt.serializerOrNull(type); + try { + serializer = SerializersKt.serializerOrNull(type); + } + catch (IllegalArgumentException ignored) { + } if (serializer == null || hasPolymorphism(serializer.getDescriptor(), new HashSet<>())) { return null; } diff --git a/spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt b/spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt index bd86de61cfb..d12972d2a86 100644 --- a/spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/http/codec/json/KotlinSerializationJsonDecoderTests.kt @@ -61,6 +61,7 @@ class KotlinSerializationJsonDecoderTests : AbstractDecoderTests(), Ordered::class.java, MediaType.APPLICATION_JSON)).isFalse() assertThat(converter.canRead(typeTokenOf>(), List::class.java, MediaType.APPLICATION_JSON)).isFalse() + + assertThat(converter.canRead(ResolvableType.NONE.type, null, MediaType.APPLICATION_JSON)).isFalse() } @Test @@ -83,6 +86,8 @@ class KotlinSerializationJsonHttpMessageConverterTests { assertThat(converter.canWrite(typeTokenOf>(), List::class.java, MediaType.APPLICATION_PDF)).isFalse() assertThat(converter.canWrite(typeTokenOf(), Ordered::class.java, MediaType.APPLICATION_JSON)).isFalse() + + assertThat(converter.canWrite(ResolvableType.NONE.type, SerializableBean::class.java, MediaType.APPLICATION_JSON)).isFalse() } @Test