diff --git a/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java b/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java index 929d07a65..7626cb356 100644 --- a/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java +++ b/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java @@ -166,6 +166,11 @@ public interface PreferredConstructorDiscoverer primaryConstructor = KClasses .getPrimaryConstructor(JvmClassMappingKt.getKotlinClass(type.getType())); + + if (primaryConstructor == null) { + return DEFAULT.discover(type, entity); + } + Constructor javaConstructor = ReflectJvmMapping.getJavaConstructor(primaryConstructor); return javaConstructor != null ? buildPreferredConstructor(javaConstructor, type, entity) : null; diff --git a/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt b/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt index a21c83ddd..9916ae61d 100644 --- a/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt @@ -43,6 +43,14 @@ class PreferredConstructorDiscovererUnitTests { Assertions.assertThat(constructor.parameters.size).isEqualTo(1) } + @Test // DATACMNS-1170 + fun `should fall back to no-args constructor if no primary constructor available`() { + + val constructor = PreferredConstructorDiscoverer.discover(TwoConstructorsWithoutDefault::class.java) + + Assertions.assertThat(constructor.parameters).isEmpty() + } + @Test // DATACMNS-1126 fun `should discover annotated constructor`() { @@ -69,6 +77,17 @@ class PreferredConstructorDiscovererUnitTests { data class Simple(val firstname: String) + class TwoConstructorsWithoutDefault { + + var firstname: String? = null + + constructor() {} + + constructor(firstname: String?) { + this.firstname = firstname + } + } + class TwoConstructors(val firstname: String) { constructor(firstname: String, lastname: String) : this(firstname) }