spring-boot - 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)
}
解决方案
Jackson 无法将您的 JSON 转换为Request
对象,因为它不知道如何构造RequestPayload
实例。您将需要执行以下操作之一:
- 修改
Request
类,使杰克逊可以创建一个已知的类:data class Request(val requested_at_ms: Long, val data: SignInRequest)
- 编写自定义反序列化器并手动告诉杰克逊要创建什么类
推荐阅读
- rollupjs - Rollup.js:重现 Babel 模块解析器的任何方式(例如 ~/foo => src/foo)
- javascript - 使用用户输入进行错误检查
- ios - viewDidAppear 中的代码未执行
- java - 使用 Smook 和 Freemarker 将 Java 对象转换为 XML 的模型是什么?
- php - 如何将两个表合并为一个整体,根据所选变量更改位置?
- php - 使用 PHP 将字符串与 LARGE 文本文件(或...数据库?)进行比较
- c# - 从材质更改反照率
- c# - 为什么 .edmx 自动生成不再在 .net 核心中
- php - 在 with() 急切加载上添加 where()。
- python - 使用 Python Paramiko 通过 SSH 将输入/变量传递给命令/脚本