Anotaciones de constructor de spring en la class de datos de Kotlin con valores pnetworkingeterminados

Para usar la persistencia de spring pero mantener los types inmutables, agregué la anotación PersistenceConstructor a mis classs de datos. Esto le dice a la spring que use ese constructor al cargar classs desde la database.

Sin embargo, estoy teniendo problemas para que la spring encuentre el constructor.

data class MyData @PersistenceConstructor constructor(@Id val id: Int? = null, val a:String) 

Esto funciona el 100% del time en mi máquina pero cuando se despliega en heroku falla sistemáticamente.

Parece que, al tener valores pnetworkingeterminados para los parameters, kotlin genera más de un constructor, pero el problema es que cada constructor obtiene la anotación que se les aplica, por lo que solo la suerte (o la implementación de jdk específica) es la que recoge un resorte. El pnetworkingeterminado no tiene nombres para los parameters, por lo que Spring no sabe qué hacer con él.

Mis constructores reales son más grandes que esto, así que sería un dolor no tener valores pnetworkingeterminados. ¿Hay alguna manera de hacer que la anotación solo se aplique al constructor sin valores pnetworkingeterminados?

Puede usar la anotación @JvmOverloads y esto creará automáticamente las permutaciones del método que Java puede @JvmOverloads y también podrá aprovechar los valores pnetworkingeterminados.

De los documentos, este ejemplo:

 @JvmOverloads fun f(a: String, b: Int = 0, c: String = "abc") { ... } 

se verá desde Java como:

 // Java void f(String a, int b, String c) { } void f(String a, int b) { } // will default c void f(String a) { } // will default b and c 

Su caso es un poco diferente donde tiene un parámetro pnetworkingeterminado seguido de uno que no lo está. Simplificando tu ejemplo a:

 data class MyData @JvmOverloads constructor(val id: Int? = null, val a:String) 

produce esta vista desde Java:

 // java MyData(Int id, String a) MyData(String a) // defaults id 

Puede leer más sobre Java llamando a la interoperabilidad de Kotlin en la reference de Kotlin.

Por el momento, mi respuesta actual es definir dos constructores. Uno para usarlo tiene valores pnetworkingeterminados y uno para usar en spring que no tiene valores pnetworkingeterminados.

 data class MyData @PersistenceConstructor constructor(val a: Int?, val b:String, val c : Collection<Int>) { constructor(a: Int? = null, b: String = "", c: Collection<Int> = emptyList()) : this(a,b,c) } 

No me gusta porque es una duplicación, así que no es mi solución preferida.

  • Kotlin coroutines y Spring Framework 5 types reactivos
  • Kotlin + Spring Boot solicita sorting
  • use kotlin para springmvc No se pudo crear una instancia de la class de datos de la class bean
  • No se puede crear un oyente de events de datos de spring en Kotlin
  • El mismo extremo de reposo con diferentes PathVariable
  • ¿Cómo get el país del usuario para una request HTTP en Back-end?
  • Spring Data Elasticsearch con Script Field con Kotlin Data Class da como resultado un problema de serialization de Jackson
  • Advertencia del comstackdor al usar la anotación @Value en el proyecto Kotlin
  • Mockito / Powermock no funciona como se esperaba con Kotlin
  • Spring Boot @ Autoajustado con Kotlin en @Service siempre es nulo
  • El comstackdor Kotlin regresa: Referencia no resuelta: springframework en Spring 5.0