首页 > 解决方案 > kotlin抽象类在spring boot中反序列化

问题描述

我想将 json 反序列化为类。但在下面引发错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例com.test.api.models.requests.RequestPayload(没有创建者,如默认构造,存在):抽象类型需要映射到具体类型,具有自定义反序列化器,或者在 [Source : (PushbackInputStream); line: 3, column: 9](通过引用链:com.test.api.models.requests.Request["data"])

{
    "requested_at_ms":1234, 
    "data":{
        "user_id":"test", 
        "password":"test"
    }
}
// data class 
abstract class RequestPayload
data class Request(val requested_at_ms: Long, val data: RequestPayload)
data class SignInRequest(val userId: String, val password:String): RequestPayload()

// controller
@RequestMapping(path=["/signin"], method=[RequestMethod.POST])
fun singIn(@RequestBody request: Request) {
    println(request)
}

标签: spring-bootkotlin

解决方案


Jackson 无法将您的 JSON 转换为Request对象,因为它不知道如何构造RequestPayload实例。您将需要执行以下操作之一:

  • 修改Request类,使杰克逊可以创建一个已知的类:
    data class Request(val requested_at_ms: Long, val data: SignInRequest)
    
  • 编写自定义反序列化器并手动告诉杰克逊要创建什么类

推荐阅读