gpt4 book ai didi

java - 在嵌套的 java Spring 配置属性类中,可以使用父级的值来初始化子级吗?

转载 作者:行者123 更新时间:2023-12-01 21:12:37 27 4
gpt4 key购买 nike

我有一个 SpringBoot 2、Kotlin/Java Web 服务,它使用 @ConfigurationProperties 加载一组嵌套的类/属性以供在运行时使用。除了一件事之外,一切都工作正常:我无法弄清楚如何将值(代码)从父类(TenantProperties)传递到其嵌套子类(DatabaseProperties)。在下面的代码片段中,它是从另一个带有适当注释的父级中提取的,我试图将 TenantProperties 中的代码在构造时传递给 DatabaseProperties。无论我尝试什么,父级总是将 null 传递给子级。如果有任何建议,我将不胜感激。

class TenantProperties(
var code: String? = null,
var id: String? = null,
var name: String? = null,
var db: DatabaseProperties = DatabaseProperties(code),
var blob: BlobProperties = BlobProperties(code)
) {
class DatabaseProperties(
var code: String?,
var uriTemplate: String? = null,
var username: String? = null,
var password: String? = null
) {
fun connectionString() = "$uriTemplate".format(username, password, code)
}
}

最佳答案

在您的示例中,您将类与父对象一起初始化。 Spring 配置参数稍后输入。因此,您的嵌套类始终使用默认值进行初始化,因此配置的代码永远不会被传递下去。

为了让您的代码正常工作,我建议将类设为内部类(以便允许它们访问外部类)并延迟初始化后构建属性:

@Configuration
@ConfigurationProperties(value = "my")
class TenantProperties {

lateinit var code: String
lateinit var id: String
lateinit var name: String

val db = DatabaseProperties()

inner class DatabaseProperties {
lateinit var uriTemplate: String
lateinit var username: String
lateinit var password: String
val connectionString by lazy { "$uriTemplate".format(username, password, code) }
}
}

将所有变量设置为 lateinit 您可以获得某种类型安全性。为了使其更加健壮,您可以添加一些 validator :

@Configuration
@ConfigurationProperties(value = "my", ignoreUnknownFields = false, ignoreInvalidFields = false)
class TenantProperties {

@NotNull lateinit var code: String
@NotNull lateinit var id: String
@NotNull lateinit var name: String

val db = DatabaseProperties()

inner class DatabaseProperties {
@NotNull lateinit var uriTemplate: String
@NotNull lateinit var username: String
@NotNull lateinit var password: String
val connectionString by lazy { "$uriTemplate".format(username, password, code) }
}
}

现在,您的 application.properties 可以如下所示:

my.code=aCode
my.id=anId
my.name=aName
my.db.uri-template=http://localhost
my.db.username=admin
my.db.password=pw

关于java - 在嵌套的 java Spring 配置属性类中,可以使用父级的值来初始化子级吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58896836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com