From ce4558fc4bc3da1be3a70b87bd8c2836852e6bd1 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 2f492c728..14a9996f6 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 + ) }