Referencias inyectadas de spring en Kotlin

En Kotlin, una variable debe inicializarse en el momento de la statement, y no puede ser null less que lo haya hecho ? anexado al nombre del tipo. Entonces, una reference de frijol destinada a ser inyectada por Spring debería declararse como:

 @AutoWinetworking var someService: SomeService? = null 

La molestia es obviamente que a partir de aquí y en todas someService se usa algún service, se debe especificar algún tipo de lógica de security nula, ?: no ?: O una comprobación nula directa.

Por supuesto que podemos hacer:

 @AutoWinetworking var someService = new SomeService() 

Pero eso no siempre es posible, y la instancia de usar y tirar es simplemente confusa.

Mi pregunta es, ¿hay alguna forma de decirle a Kotlin que esta variable se inicializará y que en realidad no será null ?

Tienes dos opciones.

1) usar inyección de constructor

La inyección de constructores es, en mi opinión, la mejor manera porque claramente declara que las dependencies deben configurarse para build el object.

2) declara tu campo como lateinit

Lea más sobre el tema en el documento: https://kotlinlang.org/docs/reference/properties.html

Propiedades de inicio tardío

Normalmente, las properties declaradas como que tienen un tipo no nulo deben inicializarse en el constructor. Sin embargo, con bastante frecuencia esto no es conveniente. Por ejemplo, las properties se pueden inicializar a través de la dependency injection o en el método de configuration de una testing unitaria. En este caso, no puede suministrar un inicializador no nulo en el constructor, pero aún desea evitar las comprobaciones nulas al hacer reference a la propiedad dentro del cuerpo de una class.

 public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() // dereference directly } } 

La recomendación oficial del proyecto Spring es usar inyección de constructor. En Kotlin se verá algo como esto:

 @Service class GobblinMetricsConsumer( private val graphiteClient: GraphiteClient, private val parserService: JsonParserService, private val kafkaConfigurationProperties: KafkaConfigurationProperties ) { // code will go here } 
  • Spring Security múltiples proveedores de authentication exitosos
  • Spring REST, Kotin y los parameters primitivos pnetworkingeterminados conducen a un error
  • La ruta funcional Spring Web Flux (reactiva) no funciona como se esperaba con Kotlin
  • ¿Debo usar @Repository cuando solo uso JdbcTemplate en mi class DAO?
  • Angular: cómo publicar un file en el server al enviar el formulario
  • La variable de instancia de Kotlin es nula cuando se accede por la class proxied de Spring
  • Kotlin NoClassDefFoundError con el método @RequestMapping de spring
  • ¿Cómo hacer que Cucumber deje que Spring inyecte classs definitivas en el paso?
  • Cómo crear consultas HQL usando campos de class extendida
  • SpringMVC RequestMapping: Añadiendo .xml a la ruta del controller para la respuesta xml
  • Spring Boot no puede ejecutar una testing individual en IntelliJ