无法在@Scheduled注释中使用@ConfigurationProperties

时间:2017-02-15 13:50:26

标签: spring spring-boot

我正在使用@ConfigurationProperties来定义属性my.delay

@ConfigurationProperties( "my" )
public class MyProperties {

    private long delay = 1000L;

    public long getDelay() {
        return delay;
    }
    public void setDelay(long delay) {
        this.delay = delay;
    }
}

在调度程序方法中,我尝试使用my.delay

@SpringBootApplication
@EnableScheduling
@EnableConfigurationProperties( { MyProperties.class } )
public class TestSprPropApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestSprPropApplication.class, args);
    }

    @Scheduled( fixedDelayString = "${my.delay}" )
    public void schedule() {
        System.out.println( "scheduled" );
    }
}

然后出现以下错误:

Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'schedule': Could not resolve placeholder 'my.delay' in string value "${my.delay}"
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:454) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:324) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1633) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]

2 个答案:

答案 0 :(得分:3)

您可以使用references a bean使用@beanName

的SpEL表达式来解决此问题

你会这样使用它:

@Scheduled(fixedDelayString = "#{@myProperties.delay}")

请注意,使用了#{}(SpEL表达式)而不是${}(属性占位符)。

答案 1 :(得分:1)

我不确定您的方法是否有解决方案。但是为了简化代码并具有默认值,您可以这样:

根本不需要MyProperty个文件。你可以删除它。

使用此默认值更新@Scheduled注释:

 @Scheduled( fixedDelayString = "${my.delay:1000}" )

这意味着如果Spring找不到my.delay的属性,它会使用:之后的默认值。在你的情况下是1000

如果您想覆盖默认值,只需在application.properties文件中添加该属性:

my.delay=5000