Spring SpEL使用问题:在@Scheduled注释中的SpEL表达式中调用子实例方法不起作用

问题描述

我有多个cron任务,它们以不同的时间间隔运行,并且所有这些任务都有一些我想在超类(抽象)上执行的常见任务,并提供了一些需要由子类实现的抽象方法在这方法中,getCronExpr是必须由子类实现并返回各自的cron表达式的一种方法。这是我为实现此目的而做的事情:

public abstract class AbstractTask{
   @Scheduled(cron="#{@this.getCronExpr()}")
   public void run(){
     System.out.println("cron execution started");
   }
   public abstract String getCronExpr();
}

@Component
@EnableScheduling
@EnableAsync
public MyTask1 extends AbstractTask{
@Override
public String getCronExpr() {
    logger.info("inside getCronExpr method");
    return "0 0/2 * * * ?";
}
}

@Component
@EnableScheduling
@EnableAsync
public MyTask2 extends AbstractTask{
@Override
public String getCronExpr() {
    logger.info("inside getCronExpr method");
    return "0 0/60 * * * ?";
}
}

但是@Scheduled(cron="#{@this.getCronExpr()}")却给了我以下错误

org.springframework.beans.factory.BeanExpressionException: Expression parsing Failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1058E: A problem occurred when trying to resolve bean 'this':'Could not resolve bean reference against beanfactory'

如果我引用的是确切的bean id,而不是使用this,它可以正常工作,如下所示: @Scheduled(cron="#{@myTask1.getCronExpr()}")

但是我不能这样做,因为有多个子类,并且需要对cron表达式进行评估以对应于该子实例。从昨天开始,我在互联网上进行了搜索,并尝试了所有可能的方法,但没有一个起作用。

供您参考,我使用的是下面的弹簧罐:

spring-core-4.3.10.RELEASE.jar
spring-osgi-core-1.2.1.jar
spring-expression-4.3.10.RELEASE.jar
spring-beans-4.3.10.RELEASE.jar
spring-context-4.3.10.RELEASE.jar
spring-aop-4.3.10.RELEASE.jar
spring-data-mongodb-1.9.7.RELEASE.jar
spring-data-commons-1.12.6.RELEASE.jar
spring-tx-4.3.10.RELEASE.jar
spring-web-4.3.10.RELEASE.jar

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)