diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 3ccc197da..c3ceb6258 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -1252,7 +1252,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati Mono afterInsert = insertDocument(collectionName, dbDoc, initialized.getClass()).map(id -> { T saved = entity.populateIdIfNecessary(id); - maybeEmitEvent(new AfterSaveEvent<>(initialized, dbDoc, collectionName)); + maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)); return saved; }); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index d7b897822..52a8fafd9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -41,6 +41,7 @@ import java.math.BigInteger; import java.time.Duration; import java.time.Instant; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -85,8 +86,10 @@ import org.springframework.data.mongodb.core.index.Index; import org.springframework.data.mongodb.core.index.IndexField; import org.springframework.data.mongodb.core.index.IndexInfo; import org.springframework.data.mongodb.core.mapping.Field; +import org.springframework.data.mongodb.core.mapping.MongoId; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; +import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener; import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; @@ -3511,6 +3514,44 @@ public class MongoTemplateTests { assertThat(document.id, is(notNullValue())); } + @Test // DATAMONGO-2189 + @DirtiesContext + public void afterSaveEventContainsSavedObjectUsingInsertAll() { + + AtomicReference saved = createAfterSaveReference(); + + template.insertAll(Collections.singletonList(new ImmutableVersioned())); + + assertThat(saved.get(), is(notNullValue())); + assertThat(saved.get().id, is(notNullValue())); + } + + @Test // DATAMONGO-2189 + @DirtiesContext + public void afterSaveEventContainsSavedObjectUsingInsert() { + + AtomicReference saved = createAfterSaveReference(); + + template.insert(new ImmutableVersioned()); + + assertThat(saved.get(), is(notNullValue())); + assertThat(saved.get().id, is(notNullValue())); + } + + private AtomicReference createAfterSaveReference() { + + AtomicReference saved = new AtomicReference<>(); + context.addApplicationListener(new AbstractMongoEventListener() { + + @Override + public void onAfterSave(AfterSaveEvent event) { + saved.set(event.getSource()); + } + }); + + return saved; + } + @Test // DATAMONGO-1509 public void findsByGenericNestedListElements() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java index 52cfd540a..085df70e6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateTests.java @@ -39,6 +39,7 @@ import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -54,6 +55,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -71,11 +73,14 @@ import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeospatialIndex; import org.springframework.data.mongodb.core.index.Index; import org.springframework.data.mongodb.core.index.IndexOperationsAdapter; +import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; +import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.NearQuery; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.test.util.ReplicaSet; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -95,6 +100,7 @@ public class ReactiveMongoTemplateTests { @Autowired SimpleReactiveMongoDatabaseFactory factory; @Autowired ReactiveMongoTemplate template; + @Autowired ConfigurableApplicationContext context; @Before public void setUp() { @@ -1318,6 +1324,50 @@ public class ReactiveMongoTemplateTests { .verifyComplete(); } + @Test // DATAMONGO-2189 + @DirtiesContext + public void afterSaveEventContainsSavedObjectUsingInsert() { + + AtomicReference saved = createAfterSaveReference(); + + template.insert(new ImmutableVersioned()) // + .as(StepVerifier::create) // + .expectNextCount(1) // + .verifyComplete(); + + assertThat(saved.get()).isNotNull(); + assertThat(saved.get().id).isNotNull(); + } + + @Test // DATAMONGO-2189 + @DirtiesContext + public void afterSaveEventContainsSavedObjectUsingInsertAll() { + + AtomicReference saved = createAfterSaveReference(); + + template.insertAll(Collections.singleton(new ImmutableVersioned())) // + .as(StepVerifier::create) // + .expectNextCount(1) // + .verifyComplete(); + + assertThat(saved.get()).isNotNull(); + assertThat(saved.get().id).isNotNull(); + } + + private AtomicReference createAfterSaveReference() { + + AtomicReference saved = new AtomicReference<>(); + context.addApplicationListener(new AbstractMongoEventListener() { + + @Override + public void onAfterSave(AfterSaveEvent event) { + saved.set(event.getSource()); + } + }); + + return saved; + } + @Test // DATAMONGO-2012 public void watchesDatabaseCorrectly() throws InterruptedException {