Skip to content

Commit 915385b

Browse files
mp911dechristophstrobl
authored andcommitted
DATAMONGO-2189 - Fix AfterSaveEvent to contain the saved entity in ReactiveMongoTemplate.insert(…).
ReactiveMongoTemplate.insert(…) now uses the saved entity when emitting AfterSaveEvent. This change affects usage of immutable objects that are using Id generation. Previously, the to-be-saved entity instance was used which left the Id unpopulated. Original Pull Request: #638
1 parent e0a12d7 commit 915385b

File tree

3 files changed

+92
-2
lines changed

3 files changed

+92
-2
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1254,7 +1254,7 @@ protected <T> Mono<T> doInsert(String collectionName, T objectToSave, MongoWrite
12541254
Mono<T> afterInsert = insertDocument(collectionName, dbDoc, initialized.getClass()).map(id -> {
12551255

12561256
T saved = entity.populateIdIfNecessary(id);
1257-
maybeEmitEvent(new AfterSaveEvent<>(initialized, dbDoc, collectionName));
1257+
maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName));
12581258
return saved;
12591259
});
12601260

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.time.Duration;
4040
import java.time.Instant;
4141
import java.util.*;
42+
import java.util.concurrent.atomic.AtomicReference;
4243
import java.util.stream.Collectors;
4344
import java.util.stream.IntStream;
4445

@@ -72,7 +73,6 @@
7273
import org.springframework.data.mapping.context.PersistentEntities;
7374
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
7475
import org.springframework.data.mongodb.MongoDbFactory;
75-
import org.springframework.data.mongodb.core.mapping.MongoId;
7676
import org.springframework.data.mongodb.core.convert.DbRefResolver;
7777
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
7878
import org.springframework.data.mongodb.core.convert.LazyLoadingProxy;
@@ -83,8 +83,10 @@
8383
import org.springframework.data.mongodb.core.index.IndexField;
8484
import org.springframework.data.mongodb.core.index.IndexInfo;
8585
import org.springframework.data.mongodb.core.mapping.Field;
86+
import org.springframework.data.mongodb.core.mapping.MongoId;
8687
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
8788
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
89+
import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent;
8890
import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener;
8991
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
9092
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
@@ -3513,6 +3515,44 @@ public void onBeforeSave(BeforeSaveEvent<Document> event) {
35133515
assertThat(document.id, is(notNullValue()));
35143516
}
35153517

3518+
@Test // DATAMONGO-2189
3519+
@DirtiesContext
3520+
public void afterSaveEventContainsSavedObjectUsingInsertAll() {
3521+
3522+
AtomicReference<ImmutableVersioned> saved = createAfterSaveReference();
3523+
3524+
template.insertAll(Collections.singletonList(new ImmutableVersioned()));
3525+
3526+
assertThat(saved.get(), is(notNullValue()));
3527+
assertThat(saved.get().id, is(notNullValue()));
3528+
}
3529+
3530+
@Test // DATAMONGO-2189
3531+
@DirtiesContext
3532+
public void afterSaveEventContainsSavedObjectUsingInsert() {
3533+
3534+
AtomicReference<ImmutableVersioned> saved = createAfterSaveReference();
3535+
3536+
template.insert(new ImmutableVersioned());
3537+
3538+
assertThat(saved.get(), is(notNullValue()));
3539+
assertThat(saved.get().id, is(notNullValue()));
3540+
}
3541+
3542+
private AtomicReference<ImmutableVersioned> createAfterSaveReference() {
3543+
3544+
AtomicReference<ImmutableVersioned> saved = new AtomicReference<>();
3545+
context.addApplicationListener(new AbstractMongoEventListener<ImmutableVersioned>() {
3546+
3547+
@Override
3548+
public void onAfterSave(AfterSaveEvent<ImmutableVersioned> event) {
3549+
saved.set(event.getSource());
3550+
}
3551+
});
3552+
3553+
return saved;
3554+
}
3555+
35163556
@Test // DATAMONGO-1509
35173557
public void findsByGenericNestedListElements() {
35183558

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.util.concurrent.BlockingQueue;
4040
import java.util.concurrent.LinkedBlockingQueue;
4141
import java.util.concurrent.TimeUnit;
42+
import java.util.concurrent.atomic.AtomicReference;
4243
import java.util.stream.Collectors;
4344
import java.util.stream.IntStream;
4445

@@ -55,6 +56,7 @@
5556
import org.junit.rules.ExpectedException;
5657
import org.junit.runner.RunWith;
5758
import org.springframework.beans.factory.annotation.Autowired;
59+
import org.springframework.context.ConfigurableApplicationContext;
5860
import org.springframework.dao.DataIntegrityViolationException;
5961
import org.springframework.dao.DuplicateKeyException;
6062
import org.springframework.dao.InvalidDataAccessApiUsageException;
@@ -72,11 +74,14 @@
7274
import org.springframework.data.mongodb.core.index.GeospatialIndex;
7375
import org.springframework.data.mongodb.core.index.Index;
7476
import org.springframework.data.mongodb.core.index.IndexOperationsAdapter;
77+
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
78+
import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent;
7579
import org.springframework.data.mongodb.core.query.Criteria;
7680
import org.springframework.data.mongodb.core.query.NearQuery;
7781
import org.springframework.data.mongodb.core.query.Query;
7882
import org.springframework.data.mongodb.core.query.Update;
7983
import org.springframework.data.mongodb.test.util.ReplicaSet;
84+
import org.springframework.test.annotation.DirtiesContext;
8085
import org.springframework.test.context.ContextConfiguration;
8186
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
8287

@@ -96,6 +101,7 @@ public class ReactiveMongoTemplateTests {
96101

97102
@Autowired SimpleReactiveMongoDatabaseFactory factory;
98103
@Autowired ReactiveMongoTemplate template;
104+
@Autowired ConfigurableApplicationContext context;
99105

100106
@Before
101107
public void setUp() {
@@ -1319,6 +1325,50 @@ public void removeShouldConsiderSkipAndSort() {
13191325
.verifyComplete();
13201326
}
13211327

1328+
@Test // DATAMONGO-2189
1329+
@DirtiesContext
1330+
public void afterSaveEventContainsSavedObjectUsingInsert() {
1331+
1332+
AtomicReference<ImmutableVersioned> saved = createAfterSaveReference();
1333+
1334+
template.insert(new ImmutableVersioned()) //
1335+
.as(StepVerifier::create) //
1336+
.expectNextCount(1) //
1337+
.verifyComplete();
1338+
1339+
assertThat(saved.get()).isNotNull();
1340+
assertThat(saved.get().id).isNotNull();
1341+
}
1342+
1343+
@Test // DATAMONGO-2189
1344+
@DirtiesContext
1345+
public void afterSaveEventContainsSavedObjectUsingInsertAll() {
1346+
1347+
AtomicReference<ImmutableVersioned> saved = createAfterSaveReference();
1348+
1349+
template.insertAll(Collections.singleton(new ImmutableVersioned())) //
1350+
.as(StepVerifier::create) //
1351+
.expectNextCount(1) //
1352+
.verifyComplete();
1353+
1354+
assertThat(saved.get()).isNotNull();
1355+
assertThat(saved.get().id).isNotNull();
1356+
}
1357+
1358+
private AtomicReference<ImmutableVersioned> createAfterSaveReference() {
1359+
1360+
AtomicReference<ImmutableVersioned> saved = new AtomicReference<>();
1361+
context.addApplicationListener(new AbstractMongoEventListener<ImmutableVersioned>() {
1362+
1363+
@Override
1364+
public void onAfterSave(AfterSaveEvent<ImmutableVersioned> event) {
1365+
saved.set(event.getSource());
1366+
}
1367+
});
1368+
1369+
return saved;
1370+
}
1371+
13221372
@Test // DATAMONGO-2012
13231373
public void watchesDatabaseCorrectly() throws InterruptedException {
13241374

0 commit comments

Comments
 (0)