Kotlin & Spring Boot @ConfigurationProperties
Как правильно инициализировать ConfigurationProperties в Spring Загрузка с помощью Kotlin?
В настоящее время мне нравится в следующем примере:
@ConfigurationProperties("app")
class Config {
var foo: String? = null
}
Но это выглядит довольно уродливо, и на самом деле foo
не является var
iable, foo является константой val
ue и должен быть инициализирован во время запуска и не изменится в будущем.
Ответы
Ответ 1
Вот как у меня это работает с моим файлом application.yml.
myconfig:
my-host: ssl://example.com
my-port: 23894
my-user: user
my-pass: pass
Вот файл котлина:
@Configuration
@ConfigurationProperties(prefix = "myconfig")
class MqttProperties {
lateinit var myHost: String
lateinit var myPort: String
lateinit var myUser: String
lateinit var myPass: String
}
Это отлично сработало для меня.
Ответ 2
Как указано в документе: " Java Bean " должен быть предоставлен для использования ConfigurationProperties
. Это означает, что ваши свойства должны иметь геттеры и сеттеры, поэтому val
на данный момент невозможен.
Методы получения и установки обычно являются обязательными, поскольку привязка осуществляется через стандартные дескрипторы свойств Java Beans, как в Spring MVC. Есть случаи, когда сеттер может быть опущен [...]
Это было решено для Spring Boot 2.2.0, который должен быть выпущен в ближайшее время: https://github.com/spring-projects/spring-boot/issues/8762
Ответ 3
@Value("\${some.property.key:}")
lateinit var foo:String
можно использовать таким образом
Ответ 4
Вот как я это сделал:
application.properties
my.prefix.myValue=1
MyProperties.kt
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "my.prefix")
class MyProperties
{
private var myValue = 0
fun getMyValue(): Int {
return myValue;
}
fun setMyValue(value: Int){
myValue = value
}
}
MyService.kt
@Component
class MyService(val myProperties: MyProperties) {
fun doIt() {
System.console().printf(myProperties.getMyValue().toString())
}
}
Ответ 5
application.properties
metro.metro2.url= ######
Metro2Config.kt
@Component
@ConfigurationProperties(prefix = "metro")
data class Metro2PropertyConfiguration(
val metro2: Metro2 = Metro2()
)
data class Metro2(
var url: String ?= null
)
build.gradle
Plugins:
id 'org.jetbrains.kotlin.kapt' version '1.2.31'
// kapt dependencies required for IntelliJ auto complete of kotlin config properties class
kapt "org.springframework.boot:spring-boot-configuration-processor"
compile "org.springframework.boot:spring-boot-configuration-processor"