Аннотации конструктора Spring на классе данных Kotlin со значениями по умолчанию

Чтобы использовать весеннее сохранение, но сохраняя неизменяемые типы, я добавил аннотацию PersistenceConstructor к моим классам данных. Это говорит Spring использовать этот конструктор при загрузке классов из базы данных.

Тем не менее, мне трудно получить весну, чтобы найти конструктора.

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

Это работает 100% времени на моей машине, но при развертывании на героку он последовательно терпит неудачу.

Похоже, что, имея значения по умолчанию для параметров, kotlin генерирует несколько конструкторов, но проблема в том, что каждый конструктор получает аннотацию, применяемую к ним, поэтому просто удача (или специфическая реализация jdk), которую получает одна пружина. Значение по умолчанию не имеет имен для параметров, поэтому Spring не знает, что с ним делать.

Мои реальные конструкторы больше этого, поэтому было бы больно не иметь значений по умолчанию. Есть ли способ заставить аннотацию применять только к конструктору без значений по умолчанию?

Вы можете использовать аннотацию @JvmOverloads и это автоматически создаст перестановки метода, который может быть вызван Java, а также воспользоваться значениями по умолчанию.

В документах этого примера:

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

будет видно из Java как:

 // 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 

Ваш случай отличается тем, что у вас есть параметр по умолчанию, за которым следует тот, который не является. Упрощение вашего примера:

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

создает этот вид из Java:

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

Вы можете больше узнать о Java, который отвечает взаимодействию Kotlin в ссылке Kotlin.

В настоящий момент мой текущий ответ состоит в том, чтобы определить два конструктора. Один для меня для использования, который имеет значения по умолчанию, и один для использования весной, который не имеет значений по умолчанию.

 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) } 

Мне не нравится это как его дублирование, поэтому это не мое предпочтительное решение.

Intereting Posts