微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。