From 2ecab81eb422ac67992fbedff4b1beb1b812b982 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 1 Jul 2025 09:40:59 +0200 Subject: [PATCH] Polishing. Fix author tags. Reorder methods, add since tags. Extend reactive callbacks with configurable order. See #4914 Original pull request: #4968 --- .../mapping/event/AuditingEntityCallback.java | 21 +++++-- .../event/ReactiveAuditingEntityCallback.java | 21 +++++-- .../ReactiveValidatingEntityCallback.java | 24 ++++++-- .../event/ValidatingEntityCallback.java | 28 ++++++---- .../AuditingEntityCallbackUnitTests.java | 11 +--- ...activeAuditingEntityCallbackUnitTests.java | 56 +++++++++++++++++++ ...tiveValidatingEntityCallbackUnitTests.java | 9 +++ .../ValidatingEntityCallbackUnitTests.java | 4 -- 8 files changed, 136 insertions(+), 38 deletions(-) create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallbackUnitTests.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallback.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallback.java index 6b5dc4c09..1dc47f21b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallback.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallback.java @@ -27,7 +27,7 @@ import org.springframework.util.Assert; * {@link EntityCallback} to populate auditing related fields on an entity about to be saved. * * @author Mark Paluch - * @author yangchef1 + * @author HeeChul Yang * @since 2.2 */ public class AuditingEntityCallback implements BeforeConvertCallback, Ordered { @@ -47,17 +47,26 @@ public class AuditingEntityCallback implements BeforeConvertCallback, Or this.auditingHandlerFactory = auditingHandlerFactory; } - @Override - public Object onBeforeConvert(Object entity, String collection) { - return auditingHandlerFactory.getObject().markAudited(entity); - } - @Override public int getOrder() { return this.order; } + /** + * Specify the order value for this {@link BeforeConvertCallback}. + *

+ * The default value is {@code 100}. + * + * @see org.springframework.core.Ordered#getOrder() + * @since 5.0 + */ public void setOrder(int order) { this.order = order; } + + @Override + public Object onBeforeConvert(Object entity, String collection) { + return auditingHandlerFactory.getObject().markAudited(entity); + } + } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallback.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallback.java index 62fe05414..008b1b740 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallback.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallback.java @@ -34,6 +34,7 @@ import org.springframework.util.Assert; public class ReactiveAuditingEntityCallback implements ReactiveBeforeConvertCallback, Ordered { private final ObjectFactory auditingHandlerFactory; + private int order = 100; /** * Creates a new {@link ReactiveAuditingEntityCallback} using the given {@link MappingContext} and @@ -48,12 +49,24 @@ public class ReactiveAuditingEntityCallback implements ReactiveBeforeConvertCall } @Override - public Publisher onBeforeConvert(Object entity, String collection) { - return auditingHandlerFactory.getObject().markAudited(entity); + public int getOrder() { + return this.order; + } + + /** + * Specify the order value for this {@link BeforeConvertCallback}. + *

+ * The default value is {@code 100}. + * + * @see org.springframework.core.Ordered#getOrder() + * @since 5.0 + */ + public void setOrder(int order) { + this.order = order; } @Override - public int getOrder() { - return 100; + public Publisher onBeforeConvert(Object entity, String collection) { + return auditingHandlerFactory.getObject().markAudited(entity); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallback.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallback.java index 7011da90b..32f47c510 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallback.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallback.java @@ -39,6 +39,7 @@ import org.springframework.core.Ordered; public class ReactiveValidatingEntityCallback implements ReactiveBeforeSaveCallback, Ordered { private final BeanValidationDelegate delegate; + private int order = 100; /** * Creates a new {@link ReactiveValidatingEntityCallback} using the given {@link Validator}. @@ -49,6 +50,23 @@ public class ReactiveValidatingEntityCallback implements ReactiveBeforeSaveCallb this.delegate = new BeanValidationDelegate(validator); } + @Override + public int getOrder() { + return this.order; + } + + /** + * Specify the order value for this {@link ReactiveValidatingEntityCallback}. + *

+ * The default value is {@code 100}. + * + * @see org.springframework.core.Ordered#getOrder() + * @since 5.0 + */ + public void setOrder(int order) { + this.order = order; + } + @Override public Mono onBeforeSave(Object entity, Document document, String collection) { @@ -60,10 +78,4 @@ public class ReactiveValidatingEntityCallback implements ReactiveBeforeSaveCallb return Mono.just(entity); } - - @Override - public int getOrder() { - return 100; - } - } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallback.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallback.java index cd1afe956..89cd9c85f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallback.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallback.java @@ -33,7 +33,7 @@ import org.springframework.core.Ordered; * * @author Rene Felgenträger * @author Mark Paluch - * @author yangchef1 + * @author HeeChul Yang * @since 4.5 */ public class ValidatingEntityCallback implements BeforeSaveCallback, Ordered { @@ -50,6 +50,23 @@ public class ValidatingEntityCallback implements BeforeSaveCallback, Ord this.delegate = new BeanValidationDelegate(validator); } + @Override + public int getOrder() { + return this.order; + } + + /** + * Specify the order value for this {@link BeforeConvertCallback}. + *

+ * The default value is {@code 100}. + * + * @see org.springframework.core.Ordered#getOrder() + * @since 5.0 + */ + public void setOrder(int order) { + this.order = order; + } + @Override public Object onBeforeSave(Object entity, Document document, String collection) { @@ -61,13 +78,4 @@ public class ValidatingEntityCallback implements BeforeSaveCallback, Ord return entity; } - - @Override - public int getOrder() { - return this.order; - } - - public void setOrder(int order) { - this.order = order; - } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java index 30869adb5..6a29bea4d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.Ordered; + import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.LastModifiedDate; @@ -40,10 +40,10 @@ import org.springframework.data.mongodb.core.mapping.Unwrapped; * Unit tests for {@link AuditingEntityCallback}. * * @author Mark Paluch - * @author yangchef1 + * @author HeeChul Yang */ @ExtendWith(MockitoExtension.class) -public class AuditingEntityCallbackUnitTests { +class AuditingEntityCallbackUnitTests { private final MongoMappingContext mappingContext = new MongoMappingContext(); @@ -88,17 +88,12 @@ public class AuditingEntityCallbackUnitTests { @Test // DATAMONGO-2261 void hasExplicitOrder() { - - assertThat(callback).isInstanceOf(Ordered.class); assertThat(callback.getOrder()).isEqualTo(100); } @Test // GH-4914 void allowsChangingOrderDynamically() { - assertThat(callback).isInstanceOf(Ordered.class); - assertThat(callback.getOrder()).isEqualTo(100); - callback.setOrder(50); assertThat(callback.getOrder()).isEqualTo(50); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallbackUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallbackUnitTests.java new file mode 100644 index 000000000..e73a813d8 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveAuditingEntityCallbackUnitTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.core.mapping.event; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.data.auditing.ReactiveIsNewAwareAuditingHandler; +import org.springframework.data.mapping.context.PersistentEntities; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; + +/** + * Unit tests for {@link ReactiveAuditingEntityCallback}. + * + * @author Mark Paluch + */ +class ReactiveAuditingEntityCallbackUnitTests { + + private final MongoMappingContext mappingContext = new MongoMappingContext(); + + private ReactiveIsNewAwareAuditingHandler handler; + private ReactiveAuditingEntityCallback callback; + + @BeforeEach + void setUp() { + + mappingContext.getPersistentEntity(AuditingEntityCallbackUnitTests.Sample.class); + + handler = spy(new ReactiveIsNewAwareAuditingHandler(PersistentEntities.of(mappingContext))); + + callback = new ReactiveAuditingEntityCallback(() -> handler); + } + + @Test // GH-4914 + void allowsChangingOrderDynamically() { + + callback.setOrder(50); + assertThat(callback.getOrder()).isEqualTo(50); + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallbackUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallbackUnitTests.java index c0db92a3d..358b586e7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallbackUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ReactiveValidatingEntityCallbackUnitTests.java @@ -15,6 +15,8 @@ */ package org.springframework.data.mongodb.core.mapping.event; +import static org.assertj.core.api.Assertions.*; + import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.ValidatorFactory; @@ -64,6 +66,13 @@ class ReactiveValidatingEntityCallbackUnitTests { .verifyComplete(); } + @Test // GH-4914 + void allowsChangingOrderDynamically() { + + callback.setOrder(50); + assertThat(callback.getOrder()).isEqualTo(50); + } + record Coordinates(@NotNull @Min(0) Integer x, @NotNull @Min(0) Integer y) { Document toDocument() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallbackUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallbackUnitTests.java index f52c49e2d..95acacd49 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallbackUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/ValidatingEntityCallbackUnitTests.java @@ -26,7 +26,6 @@ import jakarta.validation.constraints.NotNull; import org.bson.Document; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.core.Ordered; /** * Unit tests for {@link ValidatingEntityCallback}. @@ -68,9 +67,6 @@ class ValidatingEntityCallbackUnitTests { @Test // GH-4914 void allowsChangingOrderDynamically() { - assertThat(callback).isInstanceOf(Ordered.class); - assertThat(callback.getOrder()).isEqualTo(100); - callback.setOrder(50); assertThat(callback.getOrder()).isEqualTo(50); }