From 07dad67c38e2fab636675267352c7ea3a98e039e Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 18 Jan 2021 13:46:31 +0100 Subject: [PATCH] Fix constructor resolution for Kotlin classes using unsigned types. We now leniently skip parameter name resolution for types using unsigned types. The issue is caused by Kotlin's DefaultConstructorMarker that doesn't report a parameter name. Closes #2215 --- .../model/PreferredConstructorDiscoverer.java | 2 +- ...PreferredConstructorDiscovererUnitTests.kt | 36 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) 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 0de125ffd..60195beaf 100644 --- a/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java +++ b/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java @@ -212,7 +212,7 @@ public interface PreferredConstructorDiscoverer type = parameterTypes.get(i); Annotation[] annotations = parameterAnnotations[i]; 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 b2e52e887..b95ff68d2 100644 --- a/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/mapping/model/PreferredConstructorDiscovererUnitTests.kt @@ -79,13 +79,27 @@ class PreferredConstructorDiscovererUnitTests { @Suppress("UNCHECKED_CAST") fun `should not resolve constructor for synthetic Kotlin class`() { - val c = Class.forName("org.springframework.data.mapping.model.TypeCreatingSyntheticClassKt") as Class + val c = + Class.forName("org.springframework.data.mapping.model.TypeCreatingSyntheticClassKt") as Class - val constructor = PreferredConstructorDiscoverer.discover(c) + val constructor = + PreferredConstructorDiscoverer.discover(c) assertThat(constructor).isNull() } + @Test // DATACMNS-1800, gh-2215 + @ExperimentalUnsignedTypes + fun `should discover constructor for class using unsigned types`() { + + val constructor = + PreferredConstructorDiscoverer.discover( + UnsignedTypesEntity::class.java + ) + + assertThat(constructor).isNotNull() + } + data class Simple(val firstname: String) class TwoConstructorsWithoutDefault { @@ -111,9 +125,23 @@ class PreferredConstructorDiscovererUnitTests { class DefaultConstructor(val firstname: String = "foo") - class TwoDefaultConstructorsAnnotated(val firstname: String = "foo", val lastname: String = "bar") { + class TwoDefaultConstructorsAnnotated( + val firstname: String = "foo", + val lastname: String = "bar" + ) { @PersistenceConstructor - constructor(firstname: String = "foo", lastname: String = "bar", age: Int) : this(firstname, lastname) + constructor(firstname: String = "foo", lastname: String = "bar", age: Int) : this( + firstname, + lastname + ) } + + @ExperimentalUnsignedTypes + data class UnsignedTypesEntity( + val id: String, + val a: UInt = 5u, + val b: Int = 5, + val c: Double = 1.5 + ) }