diff --git a/spring-modulith-events/spring-modulith-events-api/src/main/java/org/springframework/modulith/events/ApplicationModuleListener.java b/spring-modulith-events/spring-modulith-events-api/src/main/java/org/springframework/modulith/events/ApplicationModuleListener.java index d0c9abc6..2296f641 100644 --- a/spring-modulith-events/spring-modulith-events-api/src/main/java/org/springframework/modulith/events/ApplicationModuleListener.java +++ b/spring-modulith-events/spring-modulith-events-api/src/main/java/org/springframework/modulith/events/ApplicationModuleListener.java @@ -76,4 +76,13 @@ public @interface ApplicationModuleListener { */ @AliasFor(annotation = EventListener.class, attribute = "condition") String condition() default ""; + + /** + * The transaction propagation type. Defaults to {@link Propagation#REQUIRES_NEW} + * + * @since 1.3 + * @see Transactional#propagation() + */ + @AliasFor(annotation = Transactional.class, attribute = "propagation") + Propagation propagation() default Propagation.REQUIRES_NEW; } diff --git a/spring-modulith-events/spring-modulith-events-api/src/test/java/org/springframework/modulith/events/ApplicationModuleListenerUnitTests.java b/spring-modulith-events/spring-modulith-events-api/src/test/java/org/springframework/modulith/events/ApplicationModuleListenerUnitTests.java index 5e44df65..7d8db131 100644 --- a/spring-modulith-events/spring-modulith-events-api/src/test/java/org/springframework/modulith/events/ApplicationModuleListenerUnitTests.java +++ b/spring-modulith-events/spring-modulith-events-api/src/test/java/org/springframework/modulith/events/ApplicationModuleListenerUnitTests.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; import org.springframework.context.event.ApplicationListenerMethodAdapter; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * Unit tests for {@link ApplicationModuleListener}. @@ -50,10 +52,22 @@ class ApplicationModuleListenerUnitTests { assertThat(adapter.getCondition()).isEqualTo("#{false}"); } + @Test // GH-858 + void declaresCustomTransactionPropagation() throws Exception { + + var method = Sample.class.getDeclaredMethod("withCustomPropagation"); + var annotation = findMergedAnnotation(method, Transactional.class); + + assertThat(annotation.propagation()).isEqualTo(Propagation.SUPPORTS); + } + static class Sample { @ApplicationModuleListener(condition = "#{false}") void someMethod(Object event) {} + + @ApplicationModuleListener(propagation = Propagation.SUPPORTS) + void withCustomPropagation() {} } static class CustomAdapter extends ApplicationListenerMethodAdapter {