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 } 
  • Jackson serializador personalizado u object de valor?
  • No se puede usar la validation de spring con MongoDB
  • Spring Boot con la aplicación Single Page en AWS Elastic Beanstalk requiere una networkingirección adicional
  • 'Mono.and ()' no se puede llamar con los parameters proporcionados
  • Configurar un proyecto Spring Boot con Kotlin
  • Spring Security múltiples proveedores de authentication exitosos
  • ¿Cómo inyectar con IoC en las funciones de nivel superior de Kotlin? ¿Incluso uso contenedores de IoC?
  • Excepción lanzada al usar @Service en Kotlin
  • ¿Hay alguna manera de implementar la pagination en spring webflux y spring datos reactivos
  • cómo usar annotations de spring como @Autowinetworking in kotlin?
  • Spring Data crea una unión interna en OneToMany