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 d9d15361..d0c9abc6 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 @@ -66,4 +66,14 @@ public @interface ApplicationModuleListener { */ @AliasFor(annotation = EventListener.class, attribute = "id") String id() default ""; + + /** + * Spring Expression Language (SpEL) attribute used for making the event handling conditional. The default is + * {@code ""}, meaning the event is always handled. + * + * @since 1.2 + * @see EventListener#condition + */ + @AliasFor(annotation = EventListener.class, attribute = "condition") + String condition() default ""; } 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 new file mode 100644 index 00000000..5e44df65 --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-api/src/test/java/org/springframework/modulith/events/ApplicationModuleListenerUnitTests.java @@ -0,0 +1,74 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.modulith.events; + +import static org.assertj.core.api.Assertions.*; + +import java.lang.reflect.Method; + +import org.junit.jupiter.api.Test; +import org.springframework.context.event.ApplicationListenerMethodAdapter; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.AnnotatedElementUtils; + +/** + * Unit tests for {@link ApplicationModuleListener}. + * + * @author Oliver Drotbohm + */ +class ApplicationModuleListenerUnitTests { + + @Test // GH-518 + void exposesEventListenerCondition() throws Exception { + + var method = Sample.class.getDeclaredMethod("someMethod", Object.class); + var annotation = AnnotatedElementUtils.findMergedAnnotation(method, EventListener.class); + + assertThat(annotation.condition()).isEqualTo("#{false}"); + } + + @Test // GH-518 + void exposesConditionToAdapter() throws Exception { + + var method = Sample.class.getDeclaredMethod("someMethod", Object.class); + + var adapter = new CustomAdapter("someName", Sample.class, method) {}; + + assertThat(adapter.getCondition()).isEqualTo("#{false}"); + } + + static class Sample { + + @ApplicationModuleListener(condition = "#{false}") + void someMethod(Object event) {} + } + + static class CustomAdapter extends ApplicationListenerMethodAdapter { + + public CustomAdapter(String beanName, Class targetClass, Method method) { + super(beanName, targetClass, method); + } + + /* + * (non-Javadoc) + * @see org.springframework.context.event.ApplicationListenerMethodAdapter#getCondition() + */ + @Override + public String getCondition() { + return super.getCondition(); + } + } +}