如何使用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
相关产品推荐
相关产品推荐

