当前位置: 首页 > 知识库问答 >
问题:

配置属性从YML加载列表

郎俊雅
2023-03-14

我正在尝试从YML加载配置。如果这些是逗号分隔的值,我可以加载值,也可以加载列表。但我无法加载典型的YML列表。

配置类

@Component
@PropertySource("classpath:routing.yml")
@ConfigurationProperties
class RoutingProperties(){
    var angular = listOf("nothing")
    var value: String = ""
}

工作路线。yml

angular: /init, /home
value: Hello World

不工作。yml

angular:
    - init
    - home

value: Hello World

为什么我不能加载yml的第二个版本/我有一个语法错误?

环境:科特林,Spring2.0.0。M3

共有3个答案

程旭尧
2023-03-14

根据文件,你的YAML文件将被改写成一个属性文件。第一个YAML文件变成:

angular=/init, /home
value=Hello World

而第二个变成:

angular[0]=init
angular[1]=home
value=Hello World

这显然是两件截然不同的事情,因此表现不同。

此外,在文档的后面部分,YAML甚至不与@PropertySource一起工作:

YAML文件不能通过注释加载。因此,如果您需要以这种方式加载值,您需要使用属性文件。

这让我有点想知道为什么第一个案例对你有效。

文档中提到了生成的…[index]属性:

要使用SpringDataBinder实用程序(这就是@ConfigurationProperties所做的)绑定到这样的属性,您需要在目标bean中有一个java类型的属性。util。列出(或设置),您需要提供一个setter,或使用一个可变值初始化它,例如,这将绑定到上述属性

让我们来看一下Kotlin文档:listOf返回给定元素的新只读列表。因此,该列表不能按照文档的要求进行更改,我认为这就是它不起作用的原因。尝试使用可变列表(因为我从来没有使用过Kotlin,所以我不能给你工作代码)。还可以尝试将其声明java。util。列出,如果这在科特林是可能的。

范侯林
2023-03-14

有点老了,我知道。但我现在正处在同一个话题上。

到目前为止,PropertySource似乎确实可以处理yaml文件。考虑到它只允许基元类型(看起来是这样),并且不能处理嵌套元素的限制。我可能会更深入地挖掘并相应地更新我的答案,但到目前为止,被接受的答案似乎是一个有效的解决办法。

禄光霁
2023-03-14

正如@flyx所说,@PropetySource不适用于yaml文件。但是在Spring,你可以覆盖几乎所有的东西:)

属性源代码有额外的参数:工厂。可以在Default属性源代码工厂的基础上创建自己的属性源代码工厂

open class YamlPropertyLoaderFactory : DefaultPropertySourceFactory() {
    override fun createPropertySource(name: String?, resource: EncodedResource?): org.springframework.core.env.PropertySource<*> {
        if (resource == null)
            return super.createPropertySource(name, resource)

        return YamlPropertySourceLoader().load(resource.resource.filename, resource.resource, null)
    }
}

在propertysource注释中使用此工厂时:

@PropertySource("classpath:/routing.yml", factory = YamlPropertyLoaderFactory::class)

最后需要使用mutableList初始化变量angular

完整代码示例:

@Component
@PropertySource("classpath:/routing.yml", factory = YamlPropertyLoaderFactory::class)
@ConfigurationProperties
open class RoutingProperties {
    var angular = mutableListOf("nothing")
    var value: String = ""


    override fun toString(): String {
        return "RoutingProperties(angular=$angular, value='$value')"
    }
}

open class YamlPropertyLoaderFactory : DefaultPropertySourceFactory() {
    override fun createPropertySource(name: String?, resource: EncodedResource?): org.springframework.core.env.PropertySource<*> {
        if (resource == null)
            return super.createPropertySource(name, resource)

        return YamlPropertySourceLoader().load(resource.resource.filename, resource.resource, null)
    }
}

@SpringBootApplication
@EnableAutoConfiguration(exclude = arrayOf(DataSourceAutoConfiguration::class))
open class Application {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val context = SpringApplication.run(Application::class.java, *args)

            val bean = context.getBean(RoutingProperties::class.java)

            println(bean)
        }
    }
} 
 类似资料:
  • 在我的spring boot 2应用程序中,我有一个应用程序。yml as, 我的配置类是, 代码在本地计算机中运行良好,所有值都按预期加载。但cloud env Consor将yml文件序列化为环境变量,因此我的配置表示为, 这是一个字符串。我不知道Consor以何种格式表示/序列化值。现在我的DefaultRateLimitsConfig无法加载,因为它会出错, 如何以更干净的方式在两个环境中

  • 我有一个Spring Boot应用程序,它有一些配置属性。我正在尝试为一些组件编写测试,并希望从< code>test.properties文件中加载配置属性。我不能让它工作。 这是我的代码: 文件(在src/test/resources下): 配置属性类: 我的测试: 测试失败,并显示“预期实际不为空”,这意味着未设置配置属性类中的属性。

  • 我在尝试添加

  • 我在下有一个测试属性文件。但是我无法在我的单元测试中获取要加载的值。我有以下类: 在生产代码中,加载来自src/main/resources/application的值。yml。 单元测试等级: 我试图为每个应用程序添加一个测试配置文件。yml文件,看看添加ActiveProfiles(“test”)是否有效,但没有。 src/main/resources/application。yml公司 我还

  • 我已经在stackoverflow和网络上寻找解决方案。我没有见过有效的解决方案,因为可能没有一个帖子完全符合我的用例,它包含文件中的列表和对象结构。 这里有一个例子作为yaml 这是与属性文件相同的示例 我希望能够向我的应用程序提供 teddy.yml 或 teddy.properties 文件以进行配置。 这是我的课程: 我已经尝试了这种设置,使用环境来尝试访问属性,删除前缀,声明一个“Pro