我遇到了一个问题,我找不到很好的解决方案。一些背景:我们使用几种微服务,其中大多数使用其他客户端。我们发现,其中许多将针对相似的问题(即弹性)使用相似的配置。自然地,我们希望将常见的,大量重复的非业务代码提取到库中。但这就是问题:我如何在一个库中提取一个@ConstructorBinding
@ConfigurationProperties
数据类(尤其是在使用该库的代码库中这些类的多个实例)?
这是一些示例代码:
@ConstructorBinding
@ConfigurationProperties(prefix = "rest.client")
data class MyDuplicatedRestClientProperties(
val host: String,
val someOtherField: Int,
val someFieldWithDefaultValue: String = "default value"
)
我想将此导入到项目中以配置2个不同的REST客户端。我尝试过:
ClientProperties
将会扩展。可悲的是,我需要公开父类的所有字段,而这些字段实际上对复制没有帮助:abstract class MyAbstractClient(
val host: String,
val someOtherField: Int,
val someFieldWithDefaultValue: String = "default value"
)
@ConstructorBinding
@ConfigurationProperties(prefix = "rest.client")
class MyImplematationClient(
val host: String,
val someOtherField: Int,
val someFieldWithDefaultValue: String = "default value"
): MyAbstractClient(
host,
someOtherField,
someFieldWithDefaultValue
)
@Bean
将属性实例化为@ConfigurationProperties
方法,但这也不起作用,因为它迫使我将@Value
的字段放入@Configuration
类中:@Configuration
class MyConfigurationClass {
@Value("${my.client.host}")
lateinit var host: String
@Value("${my.client.someOtherField}")
lateinit var someOtherField: Int
@Value("${my.client.someFieldWithDefaultValue:default value}")
lateinit var someFieldWithDefaultValue: String
@Bean
@ConfigurationProperties
fun myClient() = MyDuplicatedRestClientProperties(
host,
someOtherField,
someFieldWithDefaultValue
)
}
答案 0 :(得分:1)
根据我的经验,您走错了路。为什么?