spring数据rest kotlin关联POST
我遵循了教程。 我还观察到,我可以通过提供关系的链接直接创建关联spring数据rest kotlin关联POST,kotlin,spring-data,spring-data-jpa,spring-data-rest,jackson-databind,Kotlin,Spring Data,Spring Data Jpa,Spring Data Rest,Jackson Databind,我遵循了教程。 我还观察到,我可以通过提供关系的链接直接创建关联 curl -i -X POST -H "Content-Type:application/json" -d '{"name":"My Library"}' http://localhost:8080/libraries curl -i -X POST -d '{"title":"Books", "library":"http://localhost:8080/libraries/1"}' -H "Content-Type:appl
curl -i -X POST -H "Content-Type:application/json" -d '{"name":"My Library"}' http://localhost:8080/libraries
curl -i -X POST -d '{"title":"Books", "library":"http://localhost:8080/libraries/1"}' -H "Content-Type:application/json" http://localhost:8080/books
这在Java和Kotlin中使用常规类时都能很好地工作
但是,如果在Kotlin中使用数据类,则会出现以下错误
2018-04-26 14:13:43.730错误79256---[nio-8080-exec-2]b.e.h.RestResponseEntityExceptionHandler:org.springframework.http.converter.httpMessageNodeAbleException:JSON解析错误:无法构造com.baeldung.models.Library的实例(尽管至少存在一个创建者):没有从字符串值(“”)反序列化的字符串参数构造函数/工厂方法;嵌套异常为com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.baeldung.models.Library的实例(尽管至少存在一个创建者):在[Source:(org.apache.catalina.connector.CoyoteInputStream)处没有字符串参数构造函数/工厂方法从字符串值(“”)反序列化;第1行,第29列](通过参考链:com.baeldung.models.Book[“library”])
我的项目中确实有相关的kotlin spring、kotlin jpa和kotlin noarg插件
代码在这里Kotlin数据类非常严格。它告诉你,基本上,它不能构造你的POKO,它列出了它尝试的一些方法。其中一种是使用字符串构造函数。另一种是通过私有字段操纵(这是通常的做法) kotlin中的数据类,如果它们的字段声明为
private val name:String
translate to(在java中)private final String name;
它不能分配给final
字段(尝试分配给私有字段是肮脏的,但当它是final时是不可能的;JVM不允许这样做),并且没有getName()
或setName()
函数,这些函数可以用作另一种水合方法
一些选择:
var
而不是val
private-var-name:String
是private-String-name
的java等价物,它将使用基于字段的(脏)变量compile(“com.fasterxml.jackson.module:jackson module 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")
}
import org.springframework.hateoas.com
导入java.time.LocalDate
导入javax.persistence*
导入javax.validation.constraints*
@实体
数据类雇员(@Pattern(regexp=“[A-Za-z0-9]+”)
@尺寸(最小值=6,最大值=32)
val name:String,
@电子邮件
@NotNull
val电子邮件:字符串?,
@牧师出席
val hireDate:LocalDate=LocalDate.now(),
@OneToMany(mappedBy=“employee”,cascade=[CascadeType.ALL])
val forms:List=listOf(),
@OneToMany(mappedBy=“employee”,cascade=[CascadeType.ALL])
val报告:List=listOf(),
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)私有值Id:Long?=null:可识别{
重写fun getId()=id
构造函数(名称:字符串):此(名称,“$name@foo.com")
}
Kotlin数据类非常严格。它告诉你,基本上,它不能构造你的POKO,它列出了它尝试的一些方法。其中一种是使用字符串构造函数。另一种是通过私有字段操作(这是通常的做法)
kotlin中的数据类,如果它们的字段声明为private val name:String
translate to(在java中)private final String name;
它不能分配给final
字段(尝试分配给私有字段是肮脏的,但当它是final时是不可能的;JVM不允许这样做),并且没有getName()
或setName()
函数,这些函数可以用作另一种水合方法
一些选择:
var
而不是val
private-var-name:String
是private-String-name
的java等价物,它将使用基于字段的(脏)变量compile(“com.fasterxml.jackson.module:jackson module 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")
}
import org.springframework.hateoas.com
导入java.time.LocalDate
导入javax.persistence*
导入javax.validation.constraints*
@实体
数据类雇员(@Pattern(regexp=“[A-Za-z0-9]+”)
@尺寸(最小值=6,最大值=32)
val name:String,
@电子邮件
@NotNull
val电子邮件:字符串?,
@牧师出席
val hireDate:LocalDate=LocalDate.now(),
@OneToMany(mappedBy=“employee”,cascade=[CascadeType.ALL])
val forms:List=listOf(),
@OneToMany(mappedBy=“employee”,cascade=[CascadeType.ALL])
val报告:List=listOf(),
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)私有值Id:Long?=null:可识别{
重写fun getId()=id
构造函数(名称:字符串):此(名称,“$name@foo.com")
}
所有kotlin都正常
只需将“数据类”替换为“类”。
Jackson在“数据类”中找不到空构造函数。并使用其他反序列化器…而不是Uri…与kotlin一起使用所有Ok
只需将“数据类”替换为“类”。
Jackson在“数据类”中找不到空构造函数。请使用其他反序列化器…而不是Uri…尝试添加
@JsonCreator(mode=JsonCreator.mode.DISAB