From 78267402bffb5c448102398d0aa28a4e1c48a16f Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 29 Nov 2023 15:51:27 +0100 Subject: [PATCH] Omit asymmetric Kotlin properties. We now skip adding asymmetric Kotlin properties if the getter returns a different type than the setter (e.g. due to value boxing). Closes #2993 --- .../data/util/KotlinBeanInfoFactory.java | 7 +++++++ .../util/KotlinBeanInfoFactoryUnitTests.kt | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/org/springframework/data/util/KotlinBeanInfoFactory.java b/src/main/java/org/springframework/data/util/KotlinBeanInfoFactory.java index 7aea48dc1..ea34095cc 100644 --- a/src/main/java/org/springframework/data/util/KotlinBeanInfoFactory.java +++ b/src/main/java/org/springframework/data/util/KotlinBeanInfoFactory.java @@ -68,6 +68,13 @@ public class KotlinBeanInfoFactory implements BeanInfoFactory, Ordered { Method getter = ReflectJvmMapping.getJavaGetter(property); Method setter = property instanceof KMutableProperty kmp ? ReflectJvmMapping.getJavaSetter(kmp) : null; + if (getter != null && setter != null && setter.getParameterCount() == 1) { + if (!getter.getReturnType().equals(setter.getParameters()[0].getType())) { + // filter asymmetric getters/setters from being considered a Java Beans property + continue; + } + } + pds.add(new PropertyDescriptor(property.getName(), getter, setter)); } } diff --git a/src/test/kotlin/org/springframework/data/util/KotlinBeanInfoFactoryUnitTests.kt b/src/test/kotlin/org/springframework/data/util/KotlinBeanInfoFactoryUnitTests.kt index 03c8ee34e..aaf1b6f5a 100644 --- a/src/test/kotlin/org/springframework/data/util/KotlinBeanInfoFactoryUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/util/KotlinBeanInfoFactoryUnitTests.kt @@ -92,6 +92,16 @@ class KotlinBeanInfoFactoryUnitTests { assertThat(pds).extracting("name").contains("myQueryLookupStrategyKey", "repositoryBaseClass") } + @Test // GH-2993 + internal fun skipsAsymmetricGettersAndSetters() { + + val pds = BeanUtils.getPropertyDescriptors(MyEntity::class.java) + + assertThat(pds).hasSize(1) + assertThat(pds[0].writeMethod).isNull() + assertThat(pds[0].readMethod).isNotNull() + } + data class SimpleDataClass(val id: String, var name: String) @JvmInline @@ -123,4 +133,12 @@ class KotlinBeanInfoFactoryUnitTests { } } + interface Interval { + val end: T + } + + class MyEntity : Interval { + override var end: Long = -1L + protected set + } }