Używam @ConfigurationsProperties, aby zdefiniować nieruchomość my.delay.

@ConfigurationProperties( "my" )
public class MyProperties {

    private long delay = 1000L;

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

W metodzie harmonogramu próbuję użyć 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" );
    }
}

Następnie pojawia się następujący błąd:

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]
7
Peter Kennedy 15 luty 2017, 16:50

2 odpowiedzi

Najlepsza odpowiedź

Nie jestem pewien, czy istnieje rozwiązanie do twojego podejścia. Ale aby uprościć swój kod, a także masz wartość domyślną, możesz iść tak:

Nie musisz mieć pliku MyProperty. Możesz go usunąć.

Zaktualizuj swoje @Scheduled adnotacja za pomocą tej wartości domyślnej:

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

Oznacza to, że wiosna nie znajdzie właściwości my.delay używa wartości domyślnej po :. W twoim przypadku jego 1000.

A jeśli chcesz zastąpić wartość domyślną, dodaj właściwość w pliku application.properties:

my.delay=5000
2
Patrick 16 luty 2017, 08:02

Możesz rozwiązać go za pomocą wyrażenia spel, które Odnosi się do fasoli przy użyciu @beanName.

Używałbyś tego w ten sposób:

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

Zauważ, że używany jest #{} (wyrażenie Spel) zamiast ${} (Placeholder nieruchomości).

4
Adam Michalik 17 maj 2017, 12:23