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等价物,它将使用基于字段的(脏)变量
  • 包括修复此问题的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")
    }
    
    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等价物,它将使用基于字段的(脏)变量
  • 包括修复此问题的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")
    }
    
    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