web-dev-qa-db-fra.com

Spring Boot avec Kotlin - L'annotation @Value ne fonctionne pas comme prévu

Je développe une application de démarrage Spring à l'aide de Kotlin. Comme je dois me connecter à une API externe (cloudinaire), j'ai décidé d'ajouter à mon application une classe de configuration afin de stocker (et de cacher à VCS) mes données sensibles comme le nom d'utilisateur, les mots de passe ou les clés d'API.

Voici donc ce que j'ai fait:

J'ai créé une classe Config:

package demons

import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.PropertySource

@Configuration
@PropertySource("classpath:application.properties")
class AppConfig {
    @Value("\${test.prop}")
    val testProperty: String? = null
}

J'ai ensuite ajouté une entrée test.prop dans mon fichier application.properties

test.prop=TEST

Cependant, dans chaque test que je lance, après avoir créé une instance d'AppConfig, son attribut testProperty est null au lieu d'être la chaîne TEST.

Par exemple, cet extrait:

val config = AppConfig()
System.out.println(config.testProperty)

imprimerait:

null

J'ai également essayé d'utiliser un fichier .properties distinct au lieu de celui par défaut comme myproperties.properties et déclarant la variable comme lateinit var. Dans ce dernier cas, la variable ne semble jamais être initialisée:

kotlin.UninitializedPropertyAccessException: lateinit property testProperty has not been initialized

Qu'est-ce que je rate?

6
Adriano Todaro

Le problème est que vous créez vous-même l'instance de AppConfig via le constructeur:

val config = AppConfig ()

Bien que cette classe puisse avoir des annotations Spring, elle n'est PAS gérée par Spring si vous créez l'instance vous-même.

Je vous recommande d'emprunter à la réponse lien que vous avez mentionné dans mon autre . Il existe de bons exemples d'utilisation de SpringBoot pour créer une application Spring pour vous. Ci-dessous, j'ai créé un exemple "fusionné" de votre test + un exemple à partir du lien. Il n'est pas nécessaire de spécifier un fichier de propriétés, car application.properties est utilisé comme source de propriété par défaut.

@SpringBootApplication
class AppConfig {
    @Value("\${test.prop}")
    val testProperty: String? = null
}

fun main(args: Array<String>) {
    val appContext = SpringApplication.run(AppConfig::class.Java, *args)
    val config = appContext.getBean(AppConfig::class.Java)
    System.out.println(config.testProperty)
}
6
nicholas.hauschild