From e8e3b03d24314d501ae40610c9971c9a23cf546a 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 | 2 +- ...RepositoryProxyPostProcessorUnitTests.java | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 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 3311c9160..3079e2112 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 @@ -89,7 +89,7 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr Object result = invocation.proceed(); - if (!invocation.getMethod().getName().equals("save")) { + 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 32dccf308..2e854db77 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 @@ -25,8 +25,10 @@ import lombok.Getter; import lombok.Value; import java.io.Serializable; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.UUID; import org.aopalliance.aop.Advice; @@ -191,6 +193,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; @@ -206,5 +225,8 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { UUID id = UUID.randomUUID(); } - interface SampleRepository extends CrudRepository {} + interface SampleRepository extends CrudRepository { + + MultipleEvents saveAndFlush(MultipleEvents events); + } }