Как использовать @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
)
Другие вопросы по тегам