在嵌套的JavaSpring配置属性类中,是否可以使用父级的值来初始化子级?

fbcarpbf  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(250)

我有一个springboot2,kotlin/javaweb服务,它使用@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)
    }
}
r1zk6ea1

r1zk6ea11#

在您的示例中,初始化类以及父对象。Spring配置参数稍后输入。所以嵌套类总是用默认值初始化,所以 code 永远不会被传下去。
为了让代码正常工作,我建议将类设置为内部类(以便允许它们访问外部类),并延迟初始化后构建属性:

@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

相关问题