DATACMNS-1663 - Support domain events for deletions.
Domain events are now also published on calls to CrudRepository.delete(…) and ….deleteAll(…). Original pull request: #436.
This commit is contained in:
committed by
Oliver Drotbohm
parent
00d77d03cd
commit
889ae01c7c
@@ -38,15 +38,17 @@ import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* {@link RepositoryProxyPostProcessor} to register a {@link MethodInterceptor} to intercept the
|
||||
* {@link CrudRepository#save(Object)} method and publish events potentially exposed via a method annotated with
|
||||
* {@link DomainEvents}. If no such method can be detected on the aggregate root, no interceptor is added. Additionally,
|
||||
* {@link RepositoryProxyPostProcessor} to register a {@link MethodInterceptor} to intercept
|
||||
* {@link CrudRepository#save(Object)} and {@link CrudRepository#delete(Object)} methods and publish events potentially
|
||||
* exposed via a method annotated with {@link DomainEvents}. If no such method can be detected on the aggregate root, no
|
||||
* interceptor is added. Additionally,
|
||||
* the aggregate root can expose a method annotated with {@link AfterDomainEventPublication}. If present, the method
|
||||
* will be invoked after all events have been published.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Christoph Strobl
|
||||
* @author Yuki Yoshida
|
||||
* @author Réda Housni Alaoui
|
||||
* @since 1.13
|
||||
* @soundtrack Henrik Freischlader Trio - Master Plan (Openness)
|
||||
*/
|
||||
@@ -75,7 +77,7 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link MethodInterceptor} to publish events exposed an aggregate on calls to a save method on the repository.
|
||||
* {@link MethodInterceptor} to publish events exposed an aggregate on calls to a save or delete method on the repository.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @since 1.13
|
||||
@@ -106,12 +108,16 @@ public class EventPublishingRepositoryProxyPostProcessor implements RepositoryPr
|
||||
Object[] arguments = invocation.getArguments();
|
||||
Object result = invocation.proceed();
|
||||
|
||||
if (!invocation.getMethod().getName().startsWith("save")) {
|
||||
String methodName = invocation.getMethod().getName();
|
||||
Object eventSource;
|
||||
if (methodName.startsWith("save")) {
|
||||
eventSource = arguments.length == 1 ? arguments[0] : result;
|
||||
} else if ((methodName.equals("delete") || methodName.equals("deleteAll")) && arguments.length == 1) {
|
||||
eventSource = arguments[0];
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
|
||||
Object eventSource = arguments.length == 1 ? arguments[0] : result;
|
||||
|
||||
eventMethod.publishEventsFrom(eventSource, publisher);
|
||||
|
||||
return result;
|
||||
|
||||
@@ -53,6 +53,7 @@ import org.springframework.data.repository.core.support.EventPublishingRepositor
|
||||
* @author Oliver Gierke
|
||||
* @author Mark Paluch
|
||||
* @author Yuki Yoshida
|
||||
* @author Réda Housni Alaoui
|
||||
* @soundtrack Henrik Freischlader Trio - Nobody Else To Blame (Openness)
|
||||
*/
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
@@ -124,7 +125,20 @@ class EventPublishingRepositoryProxyPostProcessorUnitTests {
|
||||
|
||||
verify(publisher).publishEvent(event);
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1663
|
||||
public void interceptsDeleteMethod() throws Throwable {
|
||||
SomeEvent event = new SomeEvent();
|
||||
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
|
||||
mockInvocation(invocation, SampleRepository.class.getMethod("delete", Object.class), sample);
|
||||
|
||||
EventPublishingMethodInterceptor//
|
||||
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
|
||||
.invoke(invocation);
|
||||
|
||||
verify(publisher).publishEvent(event);
|
||||
}
|
||||
|
||||
@Test // DATACMNS-928
|
||||
void doesNotInterceptNonSaveMethod() throws Throwable {
|
||||
|
||||
@@ -137,6 +151,18 @@ class EventPublishingRepositoryProxyPostProcessorUnitTests {
|
||||
verify(publisher, never()).publishEvent(any());
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1663
|
||||
public void doesNotInterceptDeleteByIdMethod() throws Throwable {
|
||||
|
||||
doReturn(SampleRepository.class.getMethod("deleteById", Object.class)).when(invocation).getMethod();
|
||||
|
||||
EventPublishingMethodInterceptor//
|
||||
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
|
||||
.invoke(invocation);
|
||||
|
||||
verify(publisher, never()).publishEvent(any());
|
||||
}
|
||||
|
||||
@Test // DATACMNS-928
|
||||
void registersAdviceIfDomainTypeExposesEvents() {
|
||||
|
||||
@@ -177,6 +203,20 @@ class EventPublishingRepositoryProxyPostProcessorUnitTests {
|
||||
verify(publisher).publishEvent(any(SomeEvent.class));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1663
|
||||
public void publishesEventsForCallToDeleteWithIterable() throws Throwable {
|
||||
|
||||
SomeEvent event = new SomeEvent();
|
||||
MultipleEvents sample = MultipleEvents.of(Collections.singletonList(event));
|
||||
mockInvocation(invocation, SampleRepository.class.getMethod("deleteAll", Iterable.class), sample);
|
||||
|
||||
EventPublishingMethodInterceptor//
|
||||
.of(EventPublishingMethod.of(MultipleEvents.class), publisher)//
|
||||
.invoke(invocation);
|
||||
|
||||
verify(publisher).publishEvent(any(SomeEvent.class));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-975
|
||||
void publishesEventsAfterSaveInvocation() throws Throwable {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user