在注释参数/参数中使用@ConfigurationProperties? 必须是编译时常量

问题描述

我正在尝试在注释中使用配置,如下所示:

@ConfigurationProperties("scheduling")
interface SchedulingConfiguration {
    val initialDelay: String
    val fixedDelay: String
}

@Singleton
class Worker(
    private val configuration: SchedulingConfiguration,) {
    private val log = LoggerFactory.getLogger(javaClass)

    @Scheduled(initialDelay = configuration.initialDelay,fixedDelay = configuration.fixedDelay)
    fun fetchQueueEntry() {
        log.info("Fetching entry")
    }
}

我收到警告 An annotation argument must be a compile-time constant

有什么方法可以让 Micronaut 做到这一点吗?

解决方法

我通过浏览 Micronaut 文档并偶然发现属性占位符来设法让它运行。即使感觉不是“最佳”,这也能正常工作。

@Singleton
class Worker {
    private val log = LoggerFactory.getLogger(javaClass)

    @Scheduled(
        initialDelay = "\${scheduling.initialDelay}",fixedDelay = "\${scheduling.fixedDelay}"
    )    
    fun fetchQueueEntry() {
        log.info("Fetching entry")
    }
}

如果配置文件或环境变量中不存在键,也可以定义将使用的默认值:

    @Scheduled(
        initialDelay = "\${scheduling.initialDelay:0s}",fixedDelay = "\${scheduling.fixedDelay:10s}"
    )    

如果使用的属性占位符没有默认值和配置,将在运行时抛出异常,应用程序将关闭。