Skip to content

Commit 784e199

Browse files
committed
DATAMONGO-1266 - Fixed domain type lookup for methods returning primitves.
If a repository query method returned a primitive, that primitive was exposed as domain type which e.g. caused deleteBy…(…) methods to fail that returned a void. We now shortcut the MongoEntityMetadata lookup in MongoQueryMethod to use the repository's domain type if a primitive or wrapper is returned.
1 parent 1ffee80 commit 784e199

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.data.util.ClassTypeInformation;
3535
import org.springframework.data.util.TypeInformation;
3636
import org.springframework.util.Assert;
37+
import org.springframework.util.ClassUtils;
3738
import org.springframework.util.StringUtils;
3839

3940
/**
@@ -122,13 +123,22 @@ public MongoEntityMetadata<?> getEntityInformation() {
122123
Class<?> returnedObjectType = getReturnedObjectType();
123124
Class<?> domainClass = getDomainClass();
124125

125-
MongoPersistentEntity<?> returnedEntity = mappingContext.getPersistentEntity(getReturnedObjectType());
126-
MongoPersistentEntity<?> managedEntity = mappingContext.getPersistentEntity(domainClass);
127-
returnedEntity = returnedEntity == null ? managedEntity : returnedEntity;
128-
MongoPersistentEntity<?> collectionEntity = domainClass.isAssignableFrom(returnedObjectType) ? returnedEntity
129-
: managedEntity;
126+
if (ClassUtils.isPrimitiveOrWrapper(returnedObjectType)) {
130127

131-
this.metadata = new SimpleMongoEntityMetadata<Object>((Class<Object>) returnedEntity.getType(), collectionEntity);
128+
this.metadata = new SimpleMongoEntityMetadata<Object>((Class<Object>) domainClass,
129+
mappingContext.getPersistentEntity(domainClass));
130+
131+
} else {
132+
133+
MongoPersistentEntity<?> returnedEntity = mappingContext.getPersistentEntity(returnedObjectType);
134+
MongoPersistentEntity<?> managedEntity = mappingContext.getPersistentEntity(domainClass);
135+
returnedEntity = returnedEntity == null ? managedEntity : returnedEntity;
136+
MongoPersistentEntity<?> collectionEntity = domainClass.isAssignableFrom(returnedObjectType) ? returnedEntity
137+
: managedEntity;
138+
139+
this.metadata = new SimpleMongoEntityMetadata<Object>((Class<Object>) returnedEntity.getType(),
140+
collectionEntity);
141+
}
132142
}
133143

134144
return this.metadata;

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2011-2014 the original author or authors.
2+
* Copyright 2011-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -177,6 +177,17 @@ public void createsMongoQueryMethodWithSnapshotCorrectly() throws Exception {
177177
assertThat(method.getQueryMetaAttributes().getSnapshot(), is(true));
178178
}
179179

180+
/**
181+
* @see DATAMONGO-1266
182+
*/
183+
@Test
184+
public void fallsBackToRepositoryDomainTypeIfMethodDoesNotReturnADomainType() throws Exception {
185+
186+
MongoQueryMethod method = queryMethod("deleteByUserName", String.class);
187+
188+
assertThat(method.getEntityInformation().getJavaType(), is(typeCompatibleWith(User.class)));
189+
}
190+
180191
private MongoQueryMethod queryMethod(String name, Class<?>... parameters) throws Exception {
181192
Method method = PersonRepository.class.getMethod(name, parameters);
182193
return new MongoQueryMethod(method, new DefaultRepositoryMetadata(PersonRepository.class), context);
@@ -210,6 +221,10 @@ interface PersonRepository extends Repository<User, Long> {
210221
@Meta(snapshot = true)
211222
List<User> metaWithSnapshotUsage();
212223

224+
/**
225+
* @see DATAMONGO-1266
226+
*/
227+
void deleteByUserName(String userName);
213228
}
214229

215230
interface SampleRepository extends Repository<Contact, Long> {

0 commit comments

Comments
 (0)