Browse Source

DATACMNS-975 - Make sure repository method is invoked before event publication.

To make sure that event handlers can read the state of the aggregate persisted, we now invoke the call to the repository before publishing the events. That shouldn't make too much of a difference to most listeners as the event usually contains a reference to the aggregate. However, the new model generally aligns with the approach of reporting what *already has happened* better that our previous approach of first publishing the events and then invoking the repository method.

Related tickets: DATACMNS-928.
pull/194/head
Oliver Gierke 9 years ago
parent
commit
db17a28238
  1. 6
      src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java
  2. 17
      src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java

6
src/main/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessor.java

@ -87,15 +87,17 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr @@ -87,15 +87,17 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result = invocation.proceed();
if (!invocation.getMethod().getName().equals("save")) {
return invocation.proceed();
return result;
}
for (Object argument : invocation.getArguments()) {
eventMethod.publishEventsFrom(argument, publisher);
}
return invocation.proceed();
return result;
}
}

17
src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java

@ -174,6 +174,23 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { @@ -174,6 +174,23 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests {
verify(publisher).publishEvent(any(SomeEvent.class));
}
@Test // DATACMNS-975
public void publishesEventsAfterSaveInvocation() throws Throwable {
doReturn(SampleRepository.class.getMethod("save", Object.class)).when(invocation).getMethod();
doReturn(new Object[] { OneEvent.of(new SomeEvent()) }).when(invocation).getArguments();
doThrow(new IllegalStateException()).when(invocation).proceed();
try {
EventPublishingMethodInterceptor//
.of(EventPublishingMethod.of(OneEvent.class), publisher)//
.invoke(invocation);
} catch (IllegalStateException o_O) {
verify(publisher, never()).publishEvent(any(SomeEvent.class));
}
}
@Value(staticConstructor = "of")
static class MultipleEvents {
@Getter(onMethod = @__(@DomainEvents)) Collection<? extends Object> events;

Loading…
Cancel
Save