From 5d08bd6273513e870f19293157c11ec823a24e14 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 11 May 2017 09:20:36 +0200 Subject: [PATCH] =?UTF-8?q?DATACMNS-1113=20-=20Domain=20event=20publicatio?= =?UTF-8?q?n=20now=20happens=20for=20all=20methods=20starting=20with=20sav?= =?UTF-8?q?e=E2=80=A6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously we explicitly intercepted repository methods named save(…) and saveAll(…) which unfortunately results in custom variants of that (e.g. JpaRepository's saveAndFlush(…)) not causing event publication. We now publish events for methods whose names start with save…. --- ...ublishingRepositoryProxyPostProcessor.java | 3 +-- ...RepositoryProxyPostProcessorUnitTests.java | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) 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 ea04ef8d2..419a062e6 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 @@ -21,7 +21,6 @@ import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.Map; -import java.util.stream.Stream; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; @@ -90,7 +89,7 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr Object result = invocation.proceed(); - if (!Stream.of("save", "saveAll").anyMatch(it -> invocation.getMethod().getName().equals(it))) { + if (!invocation.getMethod().getName().startsWith("save")) { return result; } 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 a5c8ec142..1f82bd544 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 @@ -22,6 +22,7 @@ import static org.mockito.Mockito.*; import lombok.Getter; import lombok.Value; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -187,6 +188,23 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { } } + @Test // DATACMNS-1113 + public void invokesEventsForMethodsThatStartsWithSave() throws Throwable { + + Method method = SampleRepository.class.getMethod("saveAndFlush", MultipleEvents.class); + doReturn(method).when(invocation).getMethod(); + + SomeEvent event = new SomeEvent(); + MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event)); + doReturn(new Object[] { sample }).when(invocation).getArguments(); + + EventPublishingMethodInterceptor// + .of(EventPublishingMethod.of(MultipleEvents.class), publisher)// + .invoke(invocation); + + verify(publisher).publishEvent(event); + } + @Value(staticConstructor = "of") static class MultipleEvents { @Getter(onMethod = @__(@DomainEvents)) Collection events; @@ -202,5 +220,8 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { UUID id = UUID.randomUUID(); } - interface SampleRepository extends CrudRepository {} + interface SampleRepository extends CrudRepository { + + MultipleEvents saveAndFlush(MultipleEvents events); + } }