From 6b4b52391b8113d6ddae80463fe9ccc7f79fe61e Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 8 Apr 2016 10:09:37 +0200 Subject: [PATCH] DATACMNS-840 - ReturnedClass now aborts parameter name detection for types with multiple constructors. In case a DTO type exposes multiple no-argument constructors we now leniently abort the parameter name detection and let downstream users decide what to do in this particular case. The problematic case can't be outright rejected here already as there's valid scenarios for that, e.g. in JPA the type could be used for multiple query methods, using explict constructor expressions listing arguments explicitly and thereby select one of the multiple constructors. --- .../data/repository/query/ReturnedType.java | 5 +++++ .../query/ReturnedTypeUnitTests.java | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/org/springframework/data/repository/query/ReturnedType.java b/src/main/java/org/springframework/data/repository/query/ReturnedType.java index 0878ed150..822bcc44e 100644 --- a/src/main/java/org/springframework/data/repository/query/ReturnedType.java +++ b/src/main/java/org/springframework/data/repository/query/ReturnedType.java @@ -283,6 +283,11 @@ public abstract class ReturnedType { PreferredConstructorDiscoverer discoverer = new PreferredConstructorDiscoverer(type); PreferredConstructor constructor = discoverer.getConstructor(); + + if (constructor == null) { + return Collections.emptyList(); + } + List properties = new ArrayList(); for (PreferredConstructor.Parameter parameter : constructor.getParameters()) { diff --git a/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java b/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java index 7846ffe81..a37521ef0 100644 --- a/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java @@ -130,6 +130,17 @@ public class ReturnedTypeUnitTests { assertThat(type.getTypeToRead(), is(typeCompatibleWith(BigInteger.class))); } + /** + * @see DATACMNS-840 + */ + @Test + public void detectsSampleDtoWithDefaultConstructor() throws Exception { + + ReturnedType type = getReturnedType("dtoWithMultipleConstructors"); + + assertThat(type.getInputProperties(), is(empty())); + } + private static ReturnedType getReturnedType(String methodName, Class... parameters) throws Exception { return getQueryMethod(methodName, parameters).getResultProcessor().getReturnedType(); } @@ -162,6 +173,8 @@ public class ReturnedTypeUnitTests { Page findPageProjection(Pageable pageable); BigInteger countQuery(); + + SampleDtoWithMultipleConstructors dtoWithMultipleConstructors(); } static class Sample { @@ -180,6 +193,13 @@ public class ReturnedTypeUnitTests { } } + static class SampleDtoWithMultipleConstructors { + + SampleDtoWithMultipleConstructors(String firstname) {} + + SampleDtoWithMultipleConstructors(int age) {} + } + interface SampleProjection { String getLastname();