From 248e314486a969bfe1350d9385225a6aa32b1fe4 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 22 Apr 2014 17:47:41 +0200 Subject: [PATCH] DATACMNS-483 - Added test case for recursive object wrapper resolution. AbstractRepositoryMetadata now correctly resolves the domain type in case it's nested in multiple levels of wrapper types. --- .../support/AbstractRepositoryMetadata.java | 25 +++++++++++++------ .../DefaultRepositoryMetadataUnitTests.java | 15 +++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java b/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java index 235186d9e..ab4136a01 100644 --- a/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java +++ b/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java @@ -57,14 +57,7 @@ public abstract class AbstractRepositoryMetadata implements RepositoryMetadata { * @see org.springframework.data.repository.core.RepositoryMetadata#getReturnedDomainClass(java.lang.reflect.Method) */ public Class getReturnedDomainClass(Method method) { - - TypeInformation returnTypeInfo = typeInformation.getReturnType(method); - Class rawType = returnTypeInfo.getType(); - - boolean needToUnwrap = Iterable.class.isAssignableFrom(rawType) || rawType.isArray() - || QueryExecutionConverters.supports(rawType); - - return needToUnwrap ? returnTypeInfo.getComponentType().getType() : rawType; + return unwrapWrapperTypes(typeInformation.getReturnType(method)); } /* @@ -104,4 +97,20 @@ public abstract class AbstractRepositoryMetadata implements RepositoryMetadata { return Arrays.asList(findAllMethod.getParameterTypes()).contains(Pageable.class); } + + /** + * Recursively unwraps well known wrapper types from the given {@link TypeInformation}. + * + * @param type must not be {@literal null}. + * @return + */ + private static Class unwrapWrapperTypes(TypeInformation type) { + + Class rawType = type.getType(); + + boolean needToUnwrap = Iterable.class.isAssignableFrom(rawType) || rawType.isArray() + || QueryExecutionConverters.supports(rawType); + + return needToUnwrap ? unwrapWrapperTypes(type.getComponentType()) : rawType; + } } diff --git a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadataUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadataUnitTests.java index dc8601361..decdc781e 100644 --- a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadataUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadataUnitTests.java @@ -117,6 +117,18 @@ public class DefaultRepositoryMetadataUnitTests { assertThat(metadata.getReturnedDomainClass(method), is(typeCompatibleWith(User.class))); } + /** + * @see DATACMNS-483 + */ + @Test + public void discoversDomainTypeOnNestedReturnTypeWrapper() throws Exception { + + RepositoryMetadata metadata = new DefaultRepositoryMetadata(OptionalRepository.class); + + Method method = OptionalRepository.class.getMethod("findByLastname", String.class); + assertThat(metadata.getReturnedDomainClass(method), is(typeCompatibleWith(User.class))); + } + @SuppressWarnings("unused") private class User { @@ -187,5 +199,8 @@ public class DefaultRepositoryMetadataUnitTests { static interface OptionalRepository extends Repository { Optional findByEmailAddress(String emailAddress); + + // Contrived example but to make sure recursive wrapper resolution works + Optional> findByLastname(String lastname); } }