2016-07-13 10 views
2

Ich habe eine abstrakte Klasse wie folgt aus:Verwenden @Scheduler in einer übergeordneten abstrakten Klasse

abstract class ScheduledProcess { 

    abstract List<String> fetchNewContent() 
    abstract List<String> cron() 

    //This SPeL doesn't work just stating what kind of expression I'm looking for 
    @Scheduled(cron='#{this.cron()}') 
    void persistContent(){ 
    doSomeStuffWithContent(fetchNewContent()) 
    } 

} 

Mein Ziel ist es, mich nicht zu tun wiederholen mit der @Scheduled Methode in allen Unterklassen zu implementieren. Die cron()-Methode gibt den spezifischen Cron-Ausdruck der Unterklasse zurück. Ich finde jedoch keine Möglichkeit, den Cron-Wert an die Annotation zu übergeben. Vielleicht sehe ich dieses Problem nur falsch an.

+0

Bitte fügen Sie die Ausnahme/stacktrace/Fehler Sie – reos

Antwort

0

Sie können dort keinen SPEL verwenden, nur Eigenschaftenplatzhalter ${...}.

+0

sind immer können Sie auf der erarbeiten, warum nicht möglich ist Spel zu benutzen? Ist eine @Scheduled Annotation-spezifische Einschränkung? Mit Property-Platzhaltern haben Sie eine Idee, wie ich erreichen kann, was ich will? – rsilva4

+1

Einfach, dass der 'ScheduledAnnotationBeanPostProcessor' keine Logik hat, um einen SpEL Ausdruck auszuwerten. Eine solche Logik müsste hinzugefügt werden, wobei die aktuelle Bean als das Evaluierungsobjekt "# root" (oder anderweitig als SpEL-Variable wie "# currentBean" verfügbar gemacht wird). Nein, das kann nicht mit Platzhaltern geschehen. Sie könnten Ihren eigenen Bean-Post-Prozessor schreiben und ihn anstelle des Standard-Prozessors verwenden. aber es erfordert ein gutes Verständnis von Spring Internals und SPEL. –