diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index ee50e0da2..662146183 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -34,6 +34,7 @@ import org.springframework.data.repository.query.QueryMethod; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; /** @@ -122,13 +123,22 @@ public class MongoQueryMethod extends QueryMethod { Class returnedObjectType = getReturnedObjectType(); Class domainClass = getDomainClass(); - MongoPersistentEntity returnedEntity = mappingContext.getPersistentEntity(getReturnedObjectType()); - MongoPersistentEntity managedEntity = mappingContext.getPersistentEntity(domainClass); - returnedEntity = returnedEntity == null ? managedEntity : returnedEntity; - MongoPersistentEntity collectionEntity = domainClass.isAssignableFrom(returnedObjectType) ? returnedEntity - : managedEntity; + if (ClassUtils.isPrimitiveOrWrapper(returnedObjectType)) { - this.metadata = new SimpleMongoEntityMetadata((Class) returnedEntity.getType(), collectionEntity); + this.metadata = new SimpleMongoEntityMetadata((Class) domainClass, + mappingContext.getPersistentEntity(domainClass)); + + } else { + + MongoPersistentEntity returnedEntity = mappingContext.getPersistentEntity(returnedObjectType); + MongoPersistentEntity managedEntity = mappingContext.getPersistentEntity(domainClass); + returnedEntity = returnedEntity == null ? managedEntity : returnedEntity; + MongoPersistentEntity collectionEntity = domainClass.isAssignableFrom(returnedObjectType) ? returnedEntity + : managedEntity; + + this.metadata = new SimpleMongoEntityMetadata((Class) returnedEntity.getType(), + collectionEntity); + } } return this.metadata; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java index 7266c5392..a79018b8e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2014 the original author or authors. + * Copyright 2011-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -177,6 +177,17 @@ public class MongoQueryMethodUnitTests { assertThat(method.getQueryMetaAttributes().getSnapshot(), is(true)); } + /** + * @see DATAMONGO-1266 + */ + @Test + public void fallsBackToRepositoryDomainTypeIfMethodDoesNotReturnADomainType() throws Exception { + + MongoQueryMethod method = queryMethod("deleteByUserName", String.class); + + assertThat(method.getEntityInformation().getJavaType(), is(typeCompatibleWith(User.class))); + } + private MongoQueryMethod queryMethod(String name, Class... parameters) throws Exception { Method method = PersonRepository.class.getMethod(name, parameters); return new MongoQueryMethod(method, new DefaultRepositoryMetadata(PersonRepository.class), context); @@ -210,6 +221,10 @@ public class MongoQueryMethodUnitTests { @Meta(snapshot = true) List metaWithSnapshotUsage(); + /** + * @see DATAMONGO-1266 + */ + void deleteByUserName(String userName); } interface SampleRepository extends Repository {