You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Micronaut PropertySource在启动时将JSON文件数据映射为属性

解决方案

要在Micronaut启动时从JSON文件加载属性并替换application.yaml中的占位符,你可以通过自定义PropertySource的方式实现,步骤如下:


1. 确保Jackson依赖存在

Micronaut默认包含Jackson,但如果你的项目中没有,在Gradle构建文件中添加:

implementation("io.micronaut.jackson:micronaut-jackson-databind")

2. 修改主应用代码,动态加载JSON属性

直接在main函数中读取application.yaml配置的JSON文件路径,解析JSON内容并注册为PropertySource:

import io.micronaut.context.env.MapPropertySource
import io.micronaut.runtime.Micronaut
import com.fasterxml.jackson.databind.ObjectMapper
import java.io.File

object TestApplication {
    @JvmStatic
    fun main(args: Array<String>) {
        // 先加载初始配置,获取JSON文件路径
        val initialEnv = Micronaut.build()
            .packages("com.test")
            .mainClass(TestApplication.javaClass)
            .buildEnvironment()

        val secretsFilePath = initialEnv.getProperty("secrets.filePath", String::class.java)
            .orElseThrow { IllegalArgumentException("请配置secrets.filePath") }

        // 处理file URL路径,转换为本地文件路径
        val localFilePath = secretsFilePath.removePrefix("file://")

        // 解析JSON文件为属性Map
        val secretsProps = ObjectMapper().readValue(File(localFilePath), Map::class.java) as Map<String, Any>

        // 注册JSON属性源并启动应用
        Micronaut.build()
            .packages("com.test")
            .mainClass(TestApplication.javaClass)
            .propertySources(MapPropertySource("secrets", secretsProps))
            .start()
    }
}

3. 验证配置生效

启动应用后,mongodb.uri中的${dbusername}和${dbpassword}会被JSON文件中的值替换为testuser和testpass,最终生成的URI为:

mongodb://testuser:testpass@localhost:27117

补充说明

  • 如果JSON文件放在resources目录下,可以直接用classpath:secrets.json作为路径,无需file://前缀
  • 也可以通过实现PropertySourceLoader接口并注册到META-INF/services来实现自动加载,但动态读取配置路径的方式更灵活,适合你的场景

内容的提问来源于stack exchange,提问作者Sojan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:43:16