From 488cbdec27563e38208a84fd9644f56d9815aa71 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 --- .../model/PreferredConstructorDiscoverer.java | 6 ++++ ...eferredConstructorDiscovererUnitTests.java | 31 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) 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 f39e7a6344..f0ed1c0f37 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 @@ * * @author Oliver Gierke * @author Christoph Strobl + * @author Roman Rodov */ public class PreferredConstructorDiscoverer> { @@ -75,6 +76,11 @@ protected PreferredConstructorDiscoverer(TypeInformation type, Optional 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 76793ed567..464915b48d 100755 --- a/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java @@ -29,8 +29,9 @@ /** * Unit tests for {@link PreferredConstructorDiscoverer}. - * + * * @author Oliver Gierke + * @author Roman Rodov */ public class PreferredConstructorDiscovererUnitTests

> { @@ -106,6 +107,34 @@ public void discoversInnerClassConstructorCorrectly() { }); } + @Test // DATACMNS-1082 + public void skipsSyntheticConstructor() { + + PersistentEntity 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 { }