¿Puedo usar @autowire (spring-context) para una aplicación de escritorio kotlin?

Intento utilizar Spring DI para la aplicación de escritorio kotlinjavafx, pero Spring no inyecta un frijol en la propiedad lateinit.

Aquí está mi class de principiante

package ui @Component class Starter : Application() { override fun start(primaryStage: Stage?) { val root : Parent = FXMLLoader.load(javaClass.getResource("/view/main.fxml")) primaryStage?.title = "Title" primaryStage?.scene = Scene(root) primaryStage?.show() } companion object { @JvmStatic fun main(args: Array<String>) { AnnotationConfigApplicationContext(SpringConfig::class.java) launch(Starter::class.java, *args) } } } 

Aquí está mi class Spring-config

 package config @Configuration @ComponentScan(basePackages = arrayOf("domain", "ui")) open class SpringConfig { } 

Aquí está mi bean que quiero inyectar

 package domain @Component open class State { private val coinsState = mapOf(Coin.SYS to CoinState(Coin.SYS)) fun setActiveForCoin(coin : Coin, isActive : Boolean) { val coin = coinsState[coin] if (coin == null) throw IllegalArgumentException("Coin $coin does not exist!") coin.isActive = isActive } } 

y finalmente mi controller javafx, que debería recibir un bean (instancia del controller creado automáticamente, configuré su nombre en el file .fxml)

 package ui.controller @Component class CoinController { @Autowinetworking private lateinit var state : State @FXML fun showConfirmDialog(actionEvent: ActionEvent) { println(state) val alert = Alert(AlertType.CONFIRMATION) alert.title = "Confirmation Dialog" alert.headerText = "Look, a Confirmation Dialog" //alert.contentText = "Are you ok with this?" val result = alert.showAndWait() if (result.get() == ButtonType.OK) { // ... user chose OK } else { // ... user chose CANCEL or closed the dialog } } } 

Eche un vistazo a GluonHQ Ignite y afterburner.fx . Están destinados a proporcionar capacidades DI a su aplicación JavaFX. Normalmente prefiero el primero, porque te permite inyectar cualquier marco DI que elijas.

La configuration simple de la aplicación con encender se verá así:

 class Starter: Application() { private val context = SpringContext(this) { listOf() /* collection of packages to scan for bean definitions */ } @Autowinetworking private lateinit var loader: FXMLLoader override fun start(primaryStage: Stage) { context.init() /* ... now your FXML controllers can use autowiring */ } } 
  • ¿Por qué @Primary no funciona para las classs de Kotlin a veces?
  • ¿Es posible usar Kotlin en Grails?
  • No se puede usar la validation de spring con MongoDB
  • Complemento kotlin-spring usado, sigue recibiendo el error de class no abierta
  • El controller de exception Spring Boot @ControllerAdvice no se activa
  • Seleccione como en hibernación
  • class de datos kotlin HttpMessageNotReadableException
  • ¿Cómo hacer que Cucumber deje que Spring inyecte classs definitivas en el paso?
  • No se pudo escribir JSON: no se pudo deserializar; la exception anidada es
  • Spring Boot: no puede include recurso estático
  • ¿Cómo verificar si Mono está vacío?