我正在尝试从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
根据文件,你的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。列出
,如果这在科特林是可能的。
有点老了,我知道。但我现在正处在同一个话题上。
到目前为止,PropertySource似乎确实可以处理yaml文件。考虑到它只允许基元类型(看起来是这样),并且不能处理嵌套元素的限制。我可能会更深入地挖掘并相应地更新我的答案,但到目前为止,被接受的答案似乎是一个有效的解决办法。
正如@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