我正在使用遗留软件,其中大部分配置都是从application.properties
外部化的,它位于一个名为custom.properties
的文件中,该文件将被读入一个声明为这样的配置bean。
@Configuration
@ConfigurationProperties(locations = "classpath:custom.properties", ignoreUnknownFields = true, prefix = "custom")
public class CustomProperties {
...
}
此应用程序具有一些计划任务,其中声明以固定的间隔和时间工作。 @Scheduled(cron = "0 0 16 * * 3")
到现在为止一切正常。最近我被要求在可配置的时间内完成这个cronjob。所以我向custom.properties
添加了另一个属性,并向CustomProperties
添加了一个属性(包括getter和setter)。接下来,我将计划的注释更改为如下所示。 @Scheduled(cron = "${@customProperties.cronJob1Schedule}")
当我启动应用程序时,我得到以下异常:
java.lang.IllegalStateException: Encountered invalid @Scheduled method 'cronJob1': Could not resolve placeholder '@customProperties.cronJob1Schedule' in string value "${@bwvProperties.cronJob1Schedule}"
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:406)
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:282)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
以前有人有这个问题吗?为什么我不能在SpEL中访问配置bean?
请注意,有两种不同的机制可以处理Spring处理的字符串值:
${my.property}
Spring能够用配置的${placeholder}
中的值替换占位符property sources。此过程只是将字符串键替换为字符串值(如果需要,则通过converter运行)。
#{spel.expression}
Spring能够通过#{}
解释器运行SPeL的内容。这提供了更强大的工具,因为您可以从表达式内部与应用程序代码进行交互,例如从你的一个bean #{@cumstomProperties.cronJob1Schedule}
获取财产。
您只需要在注释值中为${
切换#{
。
假设您正在注入与此类似的配置属性,我相信您已经输了一个错字:
@Autowired
private CustomProperties bwvProperties
它应该是#{bwvProperties.cronJob1Schedule}
- 放下@
,通过$
更改#