Классы данных Kotlin довольно строгие. Он говорит вам, по сути, он не может создать ваше POKO, и он перечисляет некоторые способы, которые он пытается. Один из них с конструктором String. Другие - через частные манипуляции с полями (как это обычно делается).
Классы данных в kotlin, если у них есть поля, объявленные как private val name:String
, преобразуются в (в java) private final String name;
Он не может присваиваться полю final
(что грязно, если пытаться назначить частному полю, но невозможно, когда это окончательно; JVM не допустит этого), и нет функций getName()
или setName()
, которые можно использовать в качестве другого метода гидратации.
Некоторые опции:
- Объявите ваши переменные
var
вместо val
. private var name:String
- это эквивалент Java, равный private String name
, который будет использовать полевую (грязную) гидратацию.
- включает определенную зависимость kotlin для kotlin, которая устраняет эту проблему:
compile("com.fasterxml.jackson.module:jackson-module-kotlin")
посмотрите на этот проект
пример класса kotlin, который должен работать для вас:
import org.springframework.hateoas.Identifiable
import java.time.LocalDate
import javax.persistence.*
import javax.validation.constraints.*
@Entity
data class Employee(@Pattern(regexp = "[A-Za-z0-9]+")
@Size(min = 6, max = 32)
val name: String,
@Email
@NotNull
val email: String?,
@PastOrPresent
val hireDate: LocalDate = LocalDate.now(),
@OneToMany(mappedBy = "employee", cascade = [CascadeType.ALL])
val forms:List<Form> = listOf(),
@OneToMany(mappedBy = "employee", cascade = [CascadeType.ALL])
val reports:List<Report> = listOf(),
@Id @GeneratedValue( strategy = GenerationType.IDENTITY) private val id: Long? = null): Identifiable<Long> {
override fun getId() = id
constructor(name:String): this(name,"$name@foo.com")
}