Spring Kotlin @ConfigurationProperties for data class 在依赖项中定义
Spring Kotlin @ConfigurationProperties for data class defined in dependency
我有一个库,其配置 class(无 spring 配置 class)定义为数据 class。我想要一个可以通过 application.properties 配置的那个配置的 Bean。问题是我不知道如何告诉 Spring 根据外部数据 class 创建 ConfigurationProperties。我不是配置 class 的作者,所以我无法注释 class 本身。 @ConfigurationProperties 与@Bean 结合使用不起作用,因为属性是不可变的。这甚至可能吗?
也许更改扫描包以包含您想要的包。
@SpringBootApplication( scanBasePackages = )
看看这个:
如果我没理解错的话,您是否需要一种方法将第三方对象转换为具有您 application.properties
文件中的属性的 bean?
给定一个 application.properties
文件:
third-party-config.params.simpleParam=foo
third-party-config.params.nested.nestedOne=bar1
third-party-config.params.nested.nestedTwo=bar2
创建一个 class 以从属性文件接收您的参数
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration
@Configuration
@ConfigurationProperties(prefix = "third-party-config")
data class ThirdPartConfig(val params: Map<String, Any>)
这是您要使用的对象的示例
class ThirdPartyObject(private val simpleParam: String, private val nested: Map<String, String>) {
fun printParams() =
"This is the simple param: $simpleParam and the others nested ${nested["nestedOne"]} and ${nested["nestedTwo"]}"
}
使用将第三方对象转换为可注入 bean 的方法创建配置 class。
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class ThirdPartObjectConfig(private val thirdPartConfig: ThirdPartConfig) {
@Bean
fun thirdPartyObject(): ThirdPartyObject {
return ThirdPartObject(
simpleParam = thirdPartConfig.params["simpleParam"].toString(),
nested = getMapFromAny(
thirdPartConfig.params["nested"]
?: throw IllegalStateException("'nested' parameter must be declared in the app propertie file")
)
)
}
private fun getMapFromAny(unknownType: Any): Map<String, String> {
val asMap = unknownType as Map<*, *>
return mapOf(
"nestedOne" to asMap["nestedOne"].toString(),
"nestedTwo" to asMap["nestedTwo"].toString()
)
}
}
现在您可以将第三方对象作为 bean 注入,并使用 application.properties
文件中的自定义配置参数
@SpringBootApplication
class WhosebugAnswerApplication(private val thirdPartObject: ThirdPartObject): CommandLineRunner {
override fun run(vararg args: String?) {
println("Running --> ${thirdPartObject.printParams()}")
}
}
我有一个库,其配置 class(无 spring 配置 class)定义为数据 class。我想要一个可以通过 application.properties 配置的那个配置的 Bean。问题是我不知道如何告诉 Spring 根据外部数据 class 创建 ConfigurationProperties。我不是配置 class 的作者,所以我无法注释 class 本身。 @ConfigurationProperties 与@Bean 结合使用不起作用,因为属性是不可变的。这甚至可能吗?
也许更改扫描包以包含您想要的包。
@SpringBootApplication( scanBasePackages = )
看看这个:
如果我没理解错的话,您是否需要一种方法将第三方对象转换为具有您 application.properties
文件中的属性的 bean?
给定一个 application.properties
文件:
third-party-config.params.simpleParam=foo
third-party-config.params.nested.nestedOne=bar1
third-party-config.params.nested.nestedTwo=bar2
创建一个 class 以从属性文件接收您的参数
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration
@Configuration
@ConfigurationProperties(prefix = "third-party-config")
data class ThirdPartConfig(val params: Map<String, Any>)
这是您要使用的对象的示例
class ThirdPartyObject(private val simpleParam: String, private val nested: Map<String, String>) {
fun printParams() =
"This is the simple param: $simpleParam and the others nested ${nested["nestedOne"]} and ${nested["nestedTwo"]}"
}
使用将第三方对象转换为可注入 bean 的方法创建配置 class。
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class ThirdPartObjectConfig(private val thirdPartConfig: ThirdPartConfig) {
@Bean
fun thirdPartyObject(): ThirdPartyObject {
return ThirdPartObject(
simpleParam = thirdPartConfig.params["simpleParam"].toString(),
nested = getMapFromAny(
thirdPartConfig.params["nested"]
?: throw IllegalStateException("'nested' parameter must be declared in the app propertie file")
)
)
}
private fun getMapFromAny(unknownType: Any): Map<String, String> {
val asMap = unknownType as Map<*, *>
return mapOf(
"nestedOne" to asMap["nestedOne"].toString(),
"nestedTwo" to asMap["nestedTwo"].toString()
)
}
}
现在您可以将第三方对象作为 bean 注入,并使用 application.properties
文件中的自定义配置参数
@SpringBootApplication
class WhosebugAnswerApplication(private val thirdPartObject: ThirdPartObject): CommandLineRunner {
override fun run(vararg args: String?) {
println("Running --> ${thirdPartObject.printParams()}")
}
}