From 90fb97bcf285771920641af14b3ed83fbda35b02 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 | 8 ++++- ...eferredConstructorDiscovererUnitTests.java | 29 +++++++++++++++++++ 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 6e430c0f7..f7802f3a7 100644 --- a/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java +++ b/src/main/java/org/springframework/data/mapping/model/PreferredConstructorDiscoverer.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2015 by the original author(s). + * Copyright 2011-2017 by the original author(s). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ import org.springframework.data.util.TypeInformation; * Helper class to find a {@link PreferredConstructor}. * * @author Oliver Gierke + * @author Roman Rodov */ public class PreferredConstructorDiscoverer> { @@ -73,6 +74,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 = preferredConstructor; diff --git a/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java b/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java index 9f280baef..dc8194896 100644 --- a/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/PreferredConstructorDiscovererUnitTests.java @@ -32,6 +32,7 @@ import org.springframework.data.util.ClassTypeInformation; * Unit tests for {@link PreferredConstructorDiscoverer}. * * @author Oliver Gierke + * @author Roman Rodov */ public class PreferredConstructorDiscovererUnitTests

> { @@ -97,6 +98,34 @@ public class PreferredConstructorDiscovererUnitTests

entity = new BasicPersistentEntity( + ClassTypeInformation.from(SyntheticConstructor.class)); + PreferredConstructorDiscoverer discoverer = // + new PreferredConstructorDiscoverer(entity); + + PreferredConstructor constructor = discoverer.getConstructor(); + + PersistenceConstructor annotation = constructor.getConstructor().getAnnotation(PersistenceConstructor.class); + assertNotNull("The preferred constructor should have 'PersistenctConstructor' annotation.", annotation); + assertFalse("The preferred constructor must not be synthetic", constructor.getConstructor().isSynthetic()); + } + + 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 { }