Котлин абстрактный класс десериализации в весенней загрузке - PullRequest
0 голосов
/ 26 октября 2019

Я хочу десериализовать JSON в класс. Но поднимите ошибку ниже:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно создать экземпляр com.test.api.models.requests.RequestPayload (никаких создателей, таких как конструкция по умолчанию, не существует): абстрактные типы либо должны быть сопоставлены с конкретнымитипы, имеют собственный десериализатор или содержат дополнительную информацию о типе в [Source: (PushbackInputStream);строка: 3, столбец: 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)
}

1 Ответ

0 голосов
/ 26 октября 2019

Джексон не может преобразовать ваш JSON в объект Request, поскольку он не знает, как создать экземпляр RequestPayload. Вам нужно будет выполнить одно из следующих действий:

  • Изменить класс Request, чтобы Джексон мог создать известный класс:
    data class Request(val requested_at_ms: Long, val data: SignInRequest)
    
  • Написать Пользовательский десериализатор и вручную сообщите Джексону, какой класс создать
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...