具有外部条件的spring eventListener

时间:2017-07-16 00:01:37

标签: spring event-handling

对于我的代码中的多个EventListener,我需要一个灵活的FooEvents过滤器。 我可以使用@EventListener(condition =" event.enabled"),但我的过滤器需要分析fooEvent的许多属性。

我希望我可以在我的应用程序上下文中使用Predicate-Bean:

@Component
public class FooPredicate implements Predicate<FooEvent> {
   public boolean test(FooEvent event) {...}
}

...

@EventListener(condition="${fooPredicate.test(event)}")
public void handle(FooEvent event) { ... }

但我明白了:

org.springframework.expression.spel.SpelEvaluationException: EL1011E: 
   Method call: Attempted to call method 
   test(org.springframework.context.PayloadApplicationEvent) on null 
   context object

是否可以为EventListerns使用外部复杂条件?或者至少定义具有复杂条件的全局侦听器并继承其行为而不重复完整条件?

1 个答案:

答案 0 :(得分:7)

您使用了错误的定义,因为fooPredicate是一个弹簧bean,您需要使用'@'而不是'#'将其解析为bean。见10.5.13 Bean references

@EventListener(condition="@fooPredicate.test(#event)")
public void handle(FooEvent event) {
    System.out.println();
}