Spring SpEL访问Configuration-Bean

问题描述 投票:0回答:2

我正在使用遗留软件,其中大部分配置都是从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 spring-el
2个回答
3
投票

请注意,有两种不同的机制可以处理Spring处理的字符串值:

财产决议 - ${my.property}

Spring能够用配置的${placeholder}中的值替换占位符property sources。此过程只是将字符串键替换为字符串值(如果需要,则通过converter运行)。

春季表达语言评估 - #{spel.expression}

Spring能够通过#{}解释器运行SPeL的内容。这提供了更强大的工具,因为您可以从表达式内部与应用程序代码进行交互,例如从你的一个bean #{@cumstomProperties.cronJob1Schedule}获取财产。

TL; DR

您只需要在注释值中为${切换#{


0
投票

假设您正在注入与此类似的配置属性,我相信您已经输了一个错字:

@Autowired private CustomProperties bwvProperties

它应该是#{bwvProperties.cronJob1Schedule} - 放下@,通过$更改#

© www.soinside.com 2019 - 2024. All rights reserved.