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.
This commit is contained in:
Oliver Gierke
2017-01-13 11:40:54 +01:00
parent 389b886264
commit 9ada55b050
2 changed files with 21 additions and 2 deletions

View File

@@ -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;
}
}

View File

@@ -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;