Skip to content

Commit 908e87b

Browse files
christophstroblmp911de
authored andcommitted
Fix id conversion for fields of complex id.
This commit fixes an issue where the property type for nested fields of an complex id is not handed over correctly leading to wrong conversion results eg. for Instant types that got then turned into ObjectIds. Closes #4707 Original pull request: #4719
1 parent 2e59acc commit 908e87b

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,12 @@ private Object convertIdField(Field documentField, Object source) {
728728
} else if (isKeyword(key)) {
729729
resultDbo.put(key, convertIdField(documentField, entry.getValue()));
730730
} else {
731-
resultDbo.put(key, getMappedValue(documentField, entry.getValue()));
731+
if(documentField.getProperty() != null && documentField.getProperty().isEntity()) {
732+
Field propertyField = createPropertyField(documentField.getPropertyEntity(), key, mappingContext);
733+
resultDbo.put(key, getMappedValue(propertyField, entry.getValue()));
734+
} else {
735+
resultDbo.put(key, getMappedValue(documentField, entry.getValue()));
736+
}
732737
}
733738
}
734739

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,18 +1409,21 @@ public void executesQueryWithNegatedRegexCorrectly() {
14091409
assertThat(result.get(0).field).isEqualTo("Beauford");
14101410
}
14111411

1412-
@Test // DATAMONGO-447
1412+
@Test // DATAMONGO-447, GH-4707
14131413
public void storesAndRemovesTypeWithComplexId() {
14141414

14151415
MyId id = new MyId();
1416+
id.id = Instant.now().minusSeconds(2);
14161417
id.first = "foo";
14171418
id.second = "bar";
1419+
id.time = Instant.now().minusSeconds(3);
14181420

14191421
TypeWithMyId source = new TypeWithMyId();
14201422
source.id = id;
14211423

14221424
template.save(source);
1423-
template.remove(query(where("id").is(id)), TypeWithMyId.class);
1425+
assertThat(template.remove(query(where("id").is(id)), TypeWithMyId.class)).extracting(DeleteResult::getDeletedCount)
1426+
.isEqualTo(1L);
14241427
}
14251428

14261429
@Test // DATAMONGO-506
@@ -2554,6 +2557,29 @@ public void findAndReplaceShouldProjectReturnedObjectCorrectly() {
25542557
assertThat(projection.getName()).isEqualTo("Walter");
25552558
}
25562559

2560+
@Test // GH-4707
2561+
public void findAndReplaceUpsertsObjectWithComplexId() {
2562+
2563+
MyId id = new MyId();
2564+
id.id = Instant.now().minusSeconds(2);
2565+
id.first = "foo";
2566+
id.second = "bar";
2567+
id.time = Instant.now().minusSeconds(3);
2568+
2569+
TypeWithMyId replacement = new TypeWithMyId();
2570+
replacement.value = "spring";
2571+
2572+
template.findAndReplace(query(where("id").is(id)), replacement, FindAndReplaceOptions.options().upsert());
2573+
template.doInCollection(TypeWithMyId.class, collection -> {
2574+
2575+
org.bson.Document dbValue = collection.find(new org.bson.Document("_id.first", "foo")).first();
2576+
2577+
assertThat(dbValue).isNotNull();
2578+
assertThat(dbValue.getEmbedded(List.of("_id", "_id"), Object.class)).isInstanceOf(Date.class);
2579+
assertThat(dbValue.getEmbedded(List.of("_id", "t"), Object.class)).isInstanceOf(Date.class);
2580+
});
2581+
}
2582+
25572583
@Test // GH-4609
25582584
public void shouldReadNestedProjection() {
25592585

@@ -4397,11 +4423,15 @@ static class MyId {
43974423

43984424
String first;
43994425
String second;
4426+
Instant time;
4427+
4428+
@Field("t") Instant time;
44004429
}
44014430

44024431
static class TypeWithMyId {
44034432

44044433
@Id MyId id;
4434+
String value;
44054435
}
44064436

44074437
static class Sample {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/test/util/MongoTestTemplate.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
import org.springframework.data.mapping.callback.EntityCallbacks;
2626
import org.springframework.data.mapping.context.PersistentEntities;
2727
import org.springframework.data.mongodb.core.MongoTemplate;
28+
import org.springframework.data.mongodb.util.MongoCompatibilityAdapter;
2829

2930
import com.mongodb.MongoWriteException;
3031
import com.mongodb.client.MongoClient;
3132
import com.mongodb.client.MongoCollection;
32-
import org.springframework.data.mongodb.util.MongoCompatibilityAdapter;
3333

3434
/**
3535
* A {@link MongoTemplate} with configuration hooks and extension suitable for tests.
@@ -147,4 +147,11 @@ public void dropIndexes(Class<?>... entities) {
147147
getCollection(getCollectionName(entity)).dropIndexes();
148148
}
149149
}
150+
151+
public void doInCollection(Class<?> entityClass, Consumer<MongoCollection<Document>> callback) {
152+
execute(entityClass, (collection -> {
153+
callback.accept(collection);
154+
return null;
155+
}));
156+
}
150157
}

0 commit comments

Comments
 (0)