在嵌套的 java Spring 配置 属性 class 中,可以使用 parent 中的值来初始化 child 吗?
In a nested java Spring configuration property class, can a value from the parent be used to init the child?
我有一个 SpringBoot 2,Kotlin/Java Web 服务使用 @ConfigurationProperties 加载一组嵌套的 classes/properties 以供在运行时使用。除了一件事,一切都正常工作:我无法弄清楚如何将值(代码)从 parent class (TenantProperties) 传递到其嵌套的 child class (数据库属性)。在以下摘自另一个带有适当注释的 parent 的片段中,我试图让 TenantProperties 中的代码在构建时传递给 DatabaseProperties。无论我尝试过什么,parent 总是将 null 传递给 child。如果有任何建议,我将不胜感激。
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 配置参数在稍后输入。所以你的嵌套 类 总是用默认值初始化,所以配置的 code
永远不会被传递下去。
为了让您的代码正常工作,我建议将 类 设置为内部 类(以允许它们访问外部)并让 post -内置 属性 延迟初始化:
@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
您可以获得一些类型安全性。为了使其更加健壮,您可以添加一些验证器:
@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
我有一个 SpringBoot 2,Kotlin/Java Web 服务使用 @ConfigurationProperties 加载一组嵌套的 classes/properties 以供在运行时使用。除了一件事,一切都正常工作:我无法弄清楚如何将值(代码)从 parent class (TenantProperties) 传递到其嵌套的 child class (数据库属性)。在以下摘自另一个带有适当注释的 parent 的片段中,我试图让 TenantProperties 中的代码在构建时传递给 DatabaseProperties。无论我尝试过什么,parent 总是将 null 传递给 child。如果有任何建议,我将不胜感激。
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 配置参数在稍后输入。所以你的嵌套 类 总是用默认值初始化,所以配置的 code
永远不会被传递下去。
为了让您的代码正常工作,我建议将 类 设置为内部 类(以允许它们访问外部)并让 post -内置 属性 延迟初始化:
@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
您可以获得一些类型安全性。为了使其更加健壮,您可以添加一些验证器:
@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