Support for bean refs in event SpEL condition

Issue: SPR-13814
This commit is contained in:
Stephane Nicoll
2015-12-22 11:30:40 +01:00
parent 9b5e47026c
commit d444ef4871
3 changed files with 35 additions and 3 deletions

View File

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

View File

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