From f78b2724c1cc6aac8cf08d45d1556561a7297458 Mon Sep 17 00:00:00 2001 From: Carlos Tasada Date: Mon, 25 Mar 2024 12:06:05 +0100 Subject: [PATCH 1/2] (fix) Kotlin serializer for Collection The new Kotlin Serialization converter was not properly managing the `Collection` types. --- .../converter/KotlinxSerializationModelConverter.kt | 11 ++++------- .../KotlinxSerializationTypeConverterTest.java | 13 +++++++++++++ .../SampleEvent.kt | 6 ++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt index 9bc06a53b..59b3a953a 100644 --- a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt +++ b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt @@ -65,17 +65,14 @@ class KotlinxSerializationModelConverter(private val useFqn: Boolean = false) : val propertyType = property.returnType.jvmErasure when { - propertyType.isSubclassOf(List::class) -> { + propertyType.isSubclassOf(List::class) || propertyType.isSubclassOf(Collection::class) -> { propertySchema = ArraySchema() val value = (property.returnType.javaType as ParameterizedType).actualTypeArguments[0] propertySchema.items = resolveRefSchema(value, context) - } - propertyType.isSubclassOf(Set::class) -> { - propertySchema = ArraySchema() - val value = (property.returnType.javaType as ParameterizedType).actualTypeArguments[0] - propertySchema.items = resolveRefSchema(value, context) - propertySchema.uniqueItems = true + if (propertyType.isSubclassOf(Set::class)) { + propertySchema.uniqueItems = true + } } propertyType.isSubclassOf(Map::class) -> { diff --git a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/java/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationTypeConverterTest.java b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/java/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationTypeConverterTest.java index b5105a391..89934d490 100644 --- a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/java/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationTypeConverterTest.java +++ b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/java/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationTypeConverterTest.java @@ -68,6 +68,19 @@ void testClassWithListProperty() { assertThat(listField.getItems()).isNotNull(); assertThat(listField.getItems().getType()).isEqualTo("string"); } + + @Test + void testClassWithCollectionProperty() { + var result = modelConverters.readAll(new AnnotatedType(ClassWithCollectionProperty.class)); + Schema schema = result.get(ClassWithCollectionProperty.class.getSimpleName()); + + final Schema listField = (Schema) schema.getProperties().get("collection_field"); + assertThat(listField).isNotNull(); + assertThat(listField.getType()).isEqualTo("array"); + assertThat(listField.getNullable()).isFalse(); + assertThat(listField.getItems()).isNotNull(); + assertThat(listField.getItems().getType()).isEqualTo("string"); + } } @Nested diff --git a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/kotlin/io.github.springwolf.addons.kotlinx_serialization_model_converter.converter/SampleEvent.kt b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/kotlin/io.github.springwolf.addons.kotlinx_serialization_model_converter.converter/SampleEvent.kt index 3e4d77fb7..181c734b6 100644 --- a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/kotlin/io.github.springwolf.addons.kotlinx_serialization_model_converter.converter/SampleEvent.kt +++ b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/test/kotlin/io.github.springwolf.addons.kotlinx_serialization_model_converter.converter/SampleEvent.kt @@ -66,6 +66,12 @@ data class ClassWithSetProperty( val setField: Set, ) +@Serializable +data class ClassWithCollectionProperty( + @SerialName("collection_field") + val setField: Collection, +) + @Serializable data class ClassWithEnumProperty( @SerialName("enum_field") From 6f091b5e284ba0f32f0e4379a2fabb5f80472624 Mon Sep 17 00:00:00 2001 From: Carlos Tasada Date: Mon, 25 Mar 2024 18:41:20 +0100 Subject: [PATCH 2/2] Minor tweak --- .../converter/KotlinxSerializationModelConverter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt index 59b3a953a..8af081b9f 100644 --- a/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt +++ b/springwolf-add-ons/springwolf-kotlinx-serialization-model-converter/src/main/kotlin/io/github/springwolf/addons/kotlinx_serialization_model_converter/converter/KotlinxSerializationModelConverter.kt @@ -65,7 +65,7 @@ class KotlinxSerializationModelConverter(private val useFqn: Boolean = false) : val propertyType = property.returnType.jvmErasure when { - propertyType.isSubclassOf(List::class) || propertyType.isSubclassOf(Collection::class) -> { + propertyType.isSubclassOf(Collection::class) -> { propertySchema = ArraySchema() val value = (property.returnType.javaType as ParameterizedType).actualTypeArguments[0] propertySchema.items = resolveRefSchema(value, context)