Класс данных Kotlin и LocalDateTime - PullRequest
0 голосов
/ 31 мая 2018

У меня есть класс Ticket:

data class Ticket(
        var contact_email : String? = null,
        var date_opened : LocalDateTime? = null
)

, но я получаю сообщение об ошибке при чтении из строки:

Причина: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:Невозможно создать экземпляр java.time.LocalDateTime (никаких создателей, таких как конструкция по умолчанию, не существует): нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2017-11-13T06: 40: 00Z') в [Source: UNKNOWN;строка: -1, столбец: -1] (через цепочку ссылок: rnd_classifier.model.Ticket ["date_opened"])

Я попытался добавить аннотации без успеха:

data class Ticket(
        var contact_email : String? = null,

        @JsonSerialize(using = ToStringSerializer::class)
        @JsonDeserialize(using = LocalDateTimeDeserializer::class)
        var date_opened : LocalDateTime? = null
)

Как это исправить?

1 Ответ

0 голосов
/ 31 мая 2018

Ваша проблема больше связана с Джексоном, а не с котлином.Как указано в сериализации / десериализации java 8 java.time с помощью Jackson JSON mapper

, вам необходимо добавить дополнительную зависимость gradle для ее решения

implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.5")

после этогодолжно работать

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import org.testng.annotations.Test
import java.time.LocalDateTime

class SoTest {

    data class Ticket(
            var contact_email: String? = null,
            var date_opened: LocalDateTime? = null
    )

    @Test
    fun checkSerialize() {
        val mapper = ObjectMapper()
        mapper.registerModule(JavaTimeModule())
        val ticket = mapper.readValue(inputJsonString, Ticket::class.java)
        assert ("$ticket"=="Ticket(contact_email=contact@ema.il, date_opened=2017-11-13T06:40)")
    }

    val inputJsonString = """{
        "contact_email": "contact@ema.il",
        "date_opened": "2017-11-13T06:40:00Z"
    }""".trimIndent()

}
...