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 640f449cd..73b9ea6b5 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 @@ -1254,7 +1254,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 eec31124e..97ce66916 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 @@ -39,6 +39,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; @@ -72,7 +73,6 @@ import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.context.PersistentEntities; import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.MongoDbFactory; -import org.springframework.data.mongodb.core.mapping.MongoId; import org.springframework.data.mongodb.core.convert.DbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.LazyLoadingProxy; @@ -83,8 +83,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; @@ -3513,6 +3515,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 788bee53f..127c11dd5 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; @@ -55,6 +56,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; @@ -72,11 +74,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; @@ -96,6 +101,7 @@ public class ReactiveMongoTemplateTests { @Autowired SimpleReactiveMongoDatabaseFactory factory; @Autowired ReactiveMongoTemplate template; + @Autowired ConfigurableApplicationContext context; @Before public void setUp() { @@ -1319,6 +1325,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 {