diff --git a/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java b/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java index 4e8ccc549e..26083cc37d 100644 --- a/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java +++ b/src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java @@ -28,6 +28,8 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.AfterDomainEventPublication; import org.springframework.data.domain.DomainEvents; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Window; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.util.AnnotationDetectionMethodCallback; @@ -47,6 +49,7 @@ * @author Christoph Strobl * @author Yuki Yoshida * @author Réda Housni Alaoui + * @author Yanming Zhou * @since 1.13 * @soundtrack Henrik Freischlader Trio - Master Plan (Openness) */ @@ -268,15 +271,23 @@ private static Method getClearingMethod(AnnotationDetectionMethodCallback cle * @param source can be {@literal null}. * @return */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "rawtypes"}) private static Collection asCollection(@Nullable Object source) { if (source == null) { return Collections.emptyList(); } - if (Collection.class.isInstance(source)) { - return (Collection) source; + if (source instanceof Collection collection) { + return collection; + } + + if (source instanceof Window window) { + return window.toList(); + } + + if (source instanceof Page page) { + return page.toList(); } return Collections.singletonList(source); diff --git a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java index 9102733c4b..1cfeb64c25 100644 --- a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java @@ -38,6 +38,12 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.AfterDomainEventPublication; import org.springframework.data.domain.DomainEvents; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.ScrollPosition; +import org.springframework.data.domain.Window; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.support.EventPublishingRepositoryProxyPostProcessor.EventPublishingMethod; @@ -50,6 +56,7 @@ * @author Mark Paluch * @author Yuki Yoshida * @author Réda Housni Alaoui + * @author Yanming Zhou * @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness) */ @ExtendWith(MockitoExtension.class) @@ -199,6 +206,36 @@ void publishesEventsForCallToSaveWithIterable() throws Throwable { verify(publisher).publishEvent(any(SomeEvent.class)); } + @Test + void publishesEventsForCallToSaveWithIterableAndWindowAsParameter() throws Throwable { + + var event = new SomeEvent(); + var sample = MultipleEvents.of(Collections.singletonList(event)); + Window window = Window.from(List.of(sample), ScrollPosition::offset); + mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), window); + + EventPublishingMethodInterceptor// + .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// + .invoke(invocation); + + verify(publisher).publishEvent(any(SomeEvent.class)); + } + + @Test + void publishesEventsForCallToSaveWithIterableAndPageAsParameter() throws Throwable { + + var event = new SomeEvent(); + var sample = MultipleEvents.of(Collections.singletonList(event)); + Page page = new PageImpl<>(List.of(sample), Pageable.ofSize(10), 1); + mockInvocation(invocation, SampleRepository.class.getMethod("saveAll", Iterable.class), page); + + EventPublishingMethodInterceptor// + .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// + .invoke(invocation); + + verify(publisher).publishEvent(any(SomeEvent.class)); + } + @Test // DATACMNS-1663 void publishesEventsForCallToDeleteWithIterable() throws Throwable {