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?
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)
}