¿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 */ } } 
  • ¿Cómo verificar si Mono está vacío?
  • ¿Por qué @Primary no funciona para las classs de Kotlin a veces?
  • Cómo crear una consulta hql con left join usando el campo desde el object que se extiende
  • Los numbers en kotlin no son serializables
  • @CreationTimestamp y @UpdateTimestamp no funcionan en Kotlin
  • Kotlin no puede crear el campo @Autowinetworking en Class anotado con @Configuration @EnableWebMvc
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • Kotlin y DynamoDBMapper SaveBehavior
  • Spring Data JPA / Hibernate "No se puede ubicar Attribute con el nombre de stack"
  • ¿Cómo usar los methods Spring Data JPA que devuelven un Stream en un bloque try-with-resources en Kotlin?
  • Spring MVC Error 404 Bad Request Kotlin