From d444ef48711799734ee3752e89d4a48d8ee43cef Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 22 Dec 2015 11:30:40 +0100 Subject: [PATCH] Support for bean refs in event SpEL condition Issue: SPR-13814 --- .../ApplicationListenerMethodAdapter.java | 2 +- .../event/EventExpressionEvaluator.java | 11 ++++++-- .../AnnotationDrivenEventListenerTests.java | 25 +++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java index 243d16428a..54c1308823 100644 --- a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java +++ b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java @@ -207,7 +207,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe if (StringUtils.hasText(condition)) { Assert.notNull(this.evaluator, "EventExpressionEvaluator must no be null"); EvaluationContext evaluationContext = this.evaluator.createEvaluationContext( - event, this.targetClass, this.method, args); + event, this.targetClass, this.method, args, this.applicationContext); return this.evaluator.condition(condition, this.methodKey, evaluationContext); } return true; diff --git a/spring-context/src/main/java/org/springframework/context/event/EventExpressionEvaluator.java b/spring-context/src/main/java/org/springframework/context/event/EventExpressionEvaluator.java index 9bf4fcf6e4..0145227899 100644 --- a/spring-context/src/main/java/org/springframework/context/event/EventExpressionEvaluator.java +++ b/spring-context/src/main/java/org/springframework/context/event/EventExpressionEvaluator.java @@ -21,8 +21,10 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.springframework.aop.support.AopUtils; +import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationEvent; import org.springframework.context.expression.AnnotatedElementKey; +import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.expression.CachedExpressionEvaluator; import org.springframework.context.expression.MethodBasedEvaluationContext; import org.springframework.core.DefaultParameterNameDiscoverer; @@ -52,11 +54,16 @@ class EventExpressionEvaluator extends CachedExpressionEvaluator { * on the specified method. */ public EvaluationContext createEvaluationContext(ApplicationEvent event, Class targetClass, - Method method, Object[] args) { + Method method, Object[] args, BeanFactory beanFactory) { Method targetMethod = getTargetMethod(targetClass, method); EventExpressionRootObject root = new EventExpressionRootObject(event, args); - return new MethodBasedEvaluationContext(root, targetMethod, args, this.paramNameDiscoverer); + MethodBasedEvaluationContext evaluationContext = + new MethodBasedEvaluationContext(root, targetMethod, args, this.paramNameDiscoverer); + if (beanFactory != null) { + evaluationContext.setBeanResolver(new BeanFactoryResolver(beanFactory)); + } + return evaluationContext; } /** diff --git a/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java b/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java index 7f40e7442c..7cb3ac00e3 100644 --- a/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java +++ b/spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java @@ -462,6 +462,10 @@ public class AnnotationDrivenEventListenerTests { this.context.publishEvent(timestamp); this.eventCollector.assertEvent(listener, event, "OK", timestamp); this.eventCollector.assertTotalEventsCount(3); + + this.context.publishEvent(42d); + this.eventCollector.assertEvent(listener, event, "OK", timestamp, 42d); + this.eventCollector.assertTotalEventsCount(4); } @Test @@ -483,6 +487,10 @@ public class AnnotationDrivenEventListenerTests { this.context.publishEvent(maxLong); this.eventCollector.assertNoEventReceived(listener); this.eventCollector.assertTotalEventsCount(0); + + this.context.publishEvent(24d); + this.eventCollector.assertNoEventReceived(listener); + this.eventCollector.assertTotalEventsCount(0); } @Test @@ -534,6 +542,18 @@ public class AnnotationDrivenEventListenerTests { public CountDownLatch testCountDownLatch() { return new CountDownLatch(1); } + + @Bean + public TestConditionEvaluator conditionEvaluator() { + return new TestConditionEvaluator(); + } + + static class TestConditionEvaluator { + + public boolean valid(Double ratio) { + return new Double(42).equals(ratio); + } + } } @@ -810,6 +830,11 @@ public class AnnotationDrivenEventListenerTests { public void handleTimestamp(Long timestamp) { collectEvent(timestamp); } + + @EventListener(condition = "@conditionEvaluator.valid(#p0)") + public void handleRatio(Double ratio) { + collectEvent(ratio); + } }