Как использовать @ConfigurationProperties с Kotlin
У меня есть этот пользовательский объект:
data class Pair(
var first: String = "1",
var second: String = "2"
)
И теперь я хочу подключить его application.yml
:
my-properties:
my-integer-list:
- 1
- 2
- 3
my-map:
- "abc": "123"
- "test": "test"
pair:
first: "abc"
second: "123"
Используя этот класс:
@Configuration
@ConfigurationProperties(prefix = "my-properties")
class ComplexProperties {
lateinit var myIntegerList: List<Int>
lateinit var myMap: Map<String, String>
lateinit var pair: Pair
}
Перед добавлением Pair
все работало нормально, но после того, как я получил только Reason: lateinit property pair has not been initialized
Это мое main
:
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
@RestController
class MyRestController(
val props: ComplexProperties
) {
@GetMapping
fun getProperties(): String {
println("myIntegerList: ${props.myIntegerList}")
println("myMap: ${props.myMap}")
println("pair: ${props.pair}")
return "hello world"
}
}
С Java я уже сделал это, но я не вижу, что здесь не хватает.
2 ответа
Вы не можете сделать это с помощью lateinit var.
Решение состоит в том, чтобы либо инициализировать ваше свойство пары в null:
@Configuration
@ConfigurationProperties(prefix = "my-properties")
class ComplexProperties {
...
var pair: Pair? = null
}
Или создайте свою пару со значениями по умолчанию:
@Configuration
@ConfigurationProperties(prefix = "my-properties")
class ComplexProperties {
...
var pair = Pair()
}
Теперь вы можете автоматически связать его с вашим application.yml:
...
pair:
first: "abc"
second: "123"
Другим возможным решением является использование@ConstructionBinding
аннотация. Он будет инициализировать свойство с помощью конструктора, поэтому нет необходимости в нулевом значении значения по умолчанию.
@ConstructorBinding
@ConfigurationProperties("my-properties")
class ComplexProperties (
val pair: Pair
)