2017-07-16 2 views
2

J'ai besoin d'un filtre flexible pour FooEvents pour plusieurs EventListeners partout dans mon code. Je peux utiliser @EventListener (condition = "event.enabled"), mais mes filtres nécessitent de nombreux attributs de fooEvent à analyser.spring eventListener avec condition externe

J'espérais que je pouvais utiliser un prédicats-Bean de mon contexte d'application:

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

... 

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

Mais je reçois:

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

Est-il possible d'utiliser des conditions complexes externes, pour EventListerns? Ou au moins pour définir les auditeurs globaux avec des conditions complexes et hériter de leur comportement sans répéter les conditions complètes?

Répondre

2

Vous utilisez la mauvaise définition, car fooPredicate est un haricot de printemps dont vous avez besoin d'utiliser '@' au lieu de '#' pour le résoudre en tant que bean. voir 10.5.13 Bean references

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