From cabfa287cbce24f032e37e0a170539514ac316e9 Mon Sep 17 00:00:00 2001 From: Roman Rodov Date: Wed, 7 Jun 2017 11:40:13 +1000 Subject: [PATCH] DATACMNS-1082 - Skip synthetic constructors. Constructor discovery no longer considers synthetic constructors for preferred constructor. Original pull request: #225 --- .../model/PreferredConstructorDiscoverer.java | 6 ++++ ...eferredConstructorDiscovererUnitTests.java | 29 +++++++++++++++++++ 2 files changed, 35 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 f39e7a634..f0ed1c0f3 100644 --- a/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java +++ b/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java @@ -34,6 +34,7 @@ import org.springframework.data.util.TypeInformation; * * @author Oliver Gierke * @author Christoph Strobl + * @author Roman Rodov */ public class PreferredConstructorDiscoverer> { @@ -75,6 +76,11 @@ public class PreferredConstructorDiscoverer> PreferredConstructor preferredConstructor = buildPreferredConstructor(candidate, type, entity); + // Synthetic constructors should not be considered + if (preferredConstructor.getConstructor().isSynthetic()) { + continue; + } + // Explicitly defined constructor trumps all if (preferredConstructor.isExplicitlyAnnotated()) { this.constructor = Optional.of(preferredConstructor); diff --git a/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java b/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java index 76793ed56..e04334e45 100755 --- a/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java @@ -31,6 +31,7 @@ import org.springframework.data.util.ClassTypeInformation; * Unit tests for {@link PreferredConstructorDiscoverer}. * * @author Oliver Gierke + * @author Roman Rodov */ public class PreferredConstructorDiscovererUnitTests

> { @@ -106,6 +107,34 @@ public class PreferredConstructorDiscovererUnitTests

entity = new BasicPersistentEntity<>(ClassTypeInformation.from(SyntheticConstructor.class)); + PreferredConstructorDiscoverer discoverer = new PreferredConstructorDiscoverer<>(entity); + + assertThat(discoverer.getConstructor()).hasValueSatisfying(constructor -> { + + PersistenceConstructor annotation = constructor.getConstructor().getAnnotation(PersistenceConstructor.class); + assertThat(annotation).isNotNull(); + assertThat(constructor.getConstructor().isSynthetic()).isFalse(); + }); + } + + static class SyntheticConstructor { + @PersistenceConstructor + private SyntheticConstructor(String x) { + } + + class InnerSynthetic { + // Compiler will generate a synthetic constructor since + // SyntheticConstructor() is private. + InnerSynthetic() { + new SyntheticConstructor(""); + } + } + } + static class EntityWithoutConstructor { }