Ktor解析含嵌套对象的数组配置失败问题求助
问题
我尝试在Ktor中使用以下配置:
source { quotes { inputTopicBaseName = "quotes" providers = [ { provider = "BHS" windows = [ { grace = "PT1M" size = "PT1M" } ] }, { provider = "LSX" windows = [ { grace = "PT1M" size = "PT1M" } ] } ] } type = QUOTES }
当调用environment.config.config("source.quotes").configList("providers")时,抛出如下异常:
Exception in thread "main" io.ktor.server.config.ApplicationConfigurationException: Property source.quotes.providers.size not found. at io.ktor.server.config.MapApplicationConfig.configList(MapApplicationConfig.kt:57) at io.ktor.server.config.MergedApplicationConfig.configList(MergedApplicationConfig.kt:37)
请问该配置解析失败的原因是什么?
原因分析与解决方案
Ktor的configList方法解析列表类配置时,依赖索引式命名规则:它会先查找[列表键名].size属性确定列表长度,再通过[列表键名].[索引序号]的格式读取每个子配置项。
你当前配置中使用的数组语法(方括号包裹对象),只有在使用HOCON格式加载器(如HoconApplicationConfig)时才被支持。如果你的配置是通过MapApplicationConfig或MergedApplicationConfig加载的,这类加载器不识别数组语法,无法自动生成size属性和索引项,因此会抛出source.quotes.providers.size not found的异常。
修正方案
方案1:改用索引式配置写法
适用于所有Ktor配置加载器:
source { quotes { inputTopicBaseName = "quotes" providers { size = 2 0 { provider = "BHS" windows { size = 1 0 { grace = "PT1M" size = "PT1M" } } } 1 { provider = "LSX" windows { size = 1 0 { grace = "PT1M" size = "PT1M" } } } } } type = QUOTES }
方案2:确保使用HOCON配置加载器
如果想保留数组语法,需确保配置通过HoconApplicationConfig加载,比如将配置写在.conf文件中,然后通过HoconApplicationConfig(ConfigFactory.load())加载配置,HOCON格式原生支持数组写法,会自动处理列表解析,无需手动指定size和索引。
内容的提问来源于stack exchange,提问作者AmsterdamLuis
相关产品推荐
相关产品推荐

