Comment initialiser correctement ConfigurationProperties dans Spring Boot avec Kotlin ?
Actuellement j'aime bien dans l'exemple ci-dessous:
@ConfigurationProperties("app")
class Config {
var foo: String? = null
}
Mais cela semble plutôt moche et en fait, foo
n'est pas un var
iable, foo est constant val
ue et devrait être initialisé au démarrage et ne changera pas à l'avenir.
Voici comment cela fonctionne avec mon fichier application.yml.
myconfig:
my-Host: ssl://example.com
my-port: 23894
my-user: user
my-pass: pass
Voici le fichier kotlin:
@Configuration
@ConfigurationProperties(prefix = "myconfig")
class MqttProperties {
lateinit var myHost: String
lateinit var myPort: String
lateinit var myUser: String
lateinit var myPass: String
}
Cela a bien fonctionné pour moi.
Comme indiqué dans les docs : Un "Java Bean" doit être fourni pour pouvoir utiliser ConfigurationProperties
. Cela signifie que vos propriétés doivent disposer de getters et de setters. Par conséquent, val
n'est pas possible.
Les getters et les setters sont généralement obligatoires, car la liaison se fait via les descripteurs de propriétés Java Beans standard, comme dans Spring MVC. Il y a des cas où un passeur peut être omis [...]
Il existe cependant un problème open lié à Kotlin: https://github.com/spring-projects/spring-boot/issues/8762
@Value("\${some.property.key:}")
lateinit var foo:String
pourrait être utilisé de cette façon
Voici comment je l'ai fait:
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())
}
}