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"