Проблема с использованием Spring SpEL: не работает вызов метода дочернего экземпляра в выражении SpEL при аннотации @Scheduled

#java #spring #spring-mvc #cron #spring-el

#java #spring #spring-mvc #cron #spring-el

Вопрос:

У меня есть несколько задач 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'
  

Вместо использования this , если я ссылаюсь на точный идентификатор компонента, он работает нормально, например:
@Scheduled(cron="#{@myTask1.getCronExpr()}")

Но я не могу этого сделать, потому что существует несколько дочерних классов, и это выражение cron должно оцениваться в соответствии с дочерним экземпляром. Со вчерашнего дня я искал по всему Интернету и перепробовал все возможные способы, но ни один из них не работает.

Для вашей информации я использую приведенные ниже spring jars:

 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