From e414cd6801a83e76b987db3cc78a882558a44e7b Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 1 Jun 2016 17:50:08 +0200 Subject: [PATCH] DATACMNS-862 - ReturnedInterface now considers interfaces implemented by the domain type. We now check whether the interface return type is implemented by the domain type and opt out of all projection efforts if so. --- .../data/repository/query/ReturnedType.java | 6 +++--- .../query/ReturnedTypeUnitTests.java | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) 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 afc615ef3..8ff15d351 100644 --- a/src/main/java/org/springframework/data/repository/query/ReturnedType.java +++ b/src/main/java/org/springframework/data/repository/query/ReturnedType.java @@ -160,7 +160,7 @@ public abstract class ReturnedType { * @see org.springframework.data.repository.query.ReturnedType#needsCustomConstruction() */ public boolean needsCustomConstruction() { - return information.isClosed(); + return isProjecting() && information.isClosed(); } /* @@ -169,7 +169,7 @@ public abstract class ReturnedType { */ @Override public boolean isProjecting() { - return true; + return !information.getType().isAssignableFrom(domainType); } /* @@ -178,7 +178,7 @@ public abstract class ReturnedType { */ @Override public Class getTypeToRead() { - return information.isClosed() ? null : domainType; + return isProjecting() && information.isClosed() ? null : domainType; } /* 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 ab3eeab55..f3d3cbaa2 100644 --- a/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ReturnedTypeUnitTests.java @@ -167,6 +167,18 @@ public class ReturnedTypeUnitTests { assertThat(type.isProjecting(), is(false)); } + /** + * @see DATACMNS-862 + */ + @Test + public void considersInterfaceImplementedByDomainTypeNotProjecting() throws Exception { + + ReturnedType type = getReturnedType("findOneInterface"); + + assertThat(type.needsCustomConstruction(), is(false)); + assertThat(type.isProjecting(), is(false)); + } + private static ReturnedType getReturnedType(String methodName, Class... parameters) throws Exception { return getQueryMethod(methodName, parameters).getResultProcessor().getReturnedType(); } @@ -206,12 +218,16 @@ public class ReturnedTypeUnitTests { LocalDateTime timeQuery(); + SampleInterface findOneInterface(); + static enum MyEnum { VALUE } } - static class Sample { + static interface SampleInterface {} + + static class Sample implements SampleInterface { public String firstname, lastname; public Sample(String firstname, String lastname) {