SpEL无法访问实例变量

时间:2017-12-18 20:19:25

标签: spring spring-el

我正在尝试使用Spring Boot AutoConfigured @EnableScheduling来创建一个cron作业。如果fixedRateString是硬编码的,则作业触发完全正常。但是,如果我尝试使用SpEL来提供值,它就不会成功。

  

// JavaConfig中的Bean实例化

@Bean
public AlertbotJob2 getAlertJob2() {
    AlertbotJob2 alertbotJob2 = new AlertbotJob2("alertId", "alertName", "alertSubject", "6000", true);
    return alertbotJob2;
}
  

Bean定义

public class AlertbotJob2 {

String alertId;
String alertName;
String alertSubject;
public String cronPattern;
boolean isActive;

public AlertbotJob2() {
}

public AlertbotJob2(String alertId, String alertName, String alertSubject, String cronPattern, boolean isActive) {
    super();
    this.alertId = alertId;
    this.alertName = alertName;
    this.alertSubject = alertSubject;
    this.cronPattern = cronPattern;
    this.isActive = isActive;
}

@Scheduled(initialDelay = 60000, fixedRateString = "#{this.cronPattern}")
public void doTheJob() {
    System.out.println("DoSomething");
}

}

  

异常是::表达式解析失败;嵌套异常是org.springframework.expression.spel.SpelEvaluationException:EL1008E:在'org.springframework.beans.factory.config.BeanExpressionContext'类型的对象上找不到属性或字段'this' - 可能不公开?

我只是想动态设置触发值。请帮忙。

3 个答案:

答案 0 :(得分:0)

我认为你不能像这样使用SpEL。 也许更好的方法是在某些属性中定义你的cron模式,如:

myapp.scheduler.cronPattern=...

然后使用以下语法:

@Scheduled(cron = "${myapp.scheduler.cronPattern}")
public void doTheJob() {
    ...
}

答案 1 :(得分:0)

您无法在那里使用this

您必须通过bean名称@someBean.cronPattern来完成。

答案 2 :(得分:0)

解决方案1:如果已知硬编码模式,则使用硬编码模式 @Scheduled(cron =" 0 0/5 * * * MON-FRI")

解决方案2:如果某个属性中的模式可用 @Scheduled(cron =" $ {myapp.scheduler.cronPattern}")

解决方案3:此方法不使用注释。相反,Beans只是作为runnables实现然后覆盖SchedulingConfigurer.configureTasks()以使用taskRegistrar.addCronTask(urRunnableJob,urCronPatternFromDB)动态设置日程表。 。 Cron模式存储在数据库表中,将其初始化为如下属性。

class AppConfig { 

    @Autowired
    ConfigurableEnvironment environment;

    private void initPropertiesMap() {
        environment.getPropertySources()
            .addLast(new MapPropertySource("myAppProperties", myAppProperties.getProperties())); // Prior DAO call required to read the configs from database
    }

    @PostConstruct
    public void postConstruct() {
        initPropertiesMap();
    }

}