web-dev-qa-db-fra.com

Kotlin & Spring Boot @ConfigurationProperties

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 variable, foo est constant value et devrait être initialisé au démarrage et ne changera pas à l'avenir

17
Sonique

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.

18
Ray Hunter

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

10
s1m0nw1
@Value("\${some.property.key:}")
lateinit var foo:String

pourrait être utilisé de cette façon

1
StanislavL

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())
    }
}
0
Qutory