From 041c18bef9f8ec832e63e3aaa4adc81acfb88727 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 22 Sep 2017 11:43:16 +0200 Subject: [PATCH] DATACMNS-1170 - Fallback to default constructor discovery for Kotlin classes without primary constructor. We now fall back to default preferred constructor discovery if a Kotlin class has no primary constructor and no preferred constructor is resolved. Previously, primary constructor resolution yielded no result (returned null) which caused the subsequent Java constructor lookup to fail. Original pull request: #244. --- .../model/PreferredConstructorDiscoverer.java | 5 +++++ ...PreferredConstructorDiscovererUnitTests.kt | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) 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) }