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 + } }