Kotlin & Jackson: ошибка типа при указании пользовательской сериализации для поля класса данных

У меня есть класс данных Kotlin, который сериализуется в JSON в проекте Spring Boot. Я хотел бы настроить форматирование даты при сериализации в JSON. Имя поля должно быть сериализовано с использованием правил по умолчанию. Это выражает то, что я хотел бы сделать:

class ZonedDateTimeSerialiser : JsonSerializer<ZonedDateTime>() {
    @Throws(IOException::class)
    fun serialize(value: ZonedDateTime, gen: JsonGenerator, serializers: SerializerProvider?) {
        val parseDate: String? = value.withZoneSameInstant(ZoneId.of("Europe/Warsaw"))
        .withZoneSameLocal(ZoneOffset.UTC)
            .format(DateTimeFormatter.ISO_DATE_TIME)
        gen.writeString(parseDate)
    }
}

data class OrderNotesRequest(
    @JsonSerialize(using = ZonedDateTimeSerialiser::class)
    val date: ZonedDateTime = ZonedDateTime.now()
)

Но я получаю ошибку типа:

Type mismatch.
Required:
KClass<out (JsonSerializer<Any!>..JsonSerializer<*>?)>
Found:
KClass<ZonedDateTimeSerialiser>

Я попытался переключить параметр аннотации на contentUsing, но ошибка типа осталась прежней.

У меня просто поверхностное знание Kotlin, но я думаю, что вы пропустили ключевое слово override при переопределении метода serialize, это может быть связано с проблемой. Сказав это, остальная часть кода выглядит хорошо для меня. Пожалуйста, рассмотрите рабочие примеры в Модуль Джексона для Котлина или ...

jccampanero 19.03.2022 00:29

... в вопросе SO, связанном с это. Я надеюсь, что это помогает.

jccampanero 19.03.2022 00:29

Я думаю, вам нужно выразить это так, если вы хотите сохранить «дату» как имя в json - @JsonSerialize(using = ZonedDateTimeSerialiser.class) класс данных OrderNotesRequest(val date: ZonedDateTime = ZonedDateTime.now())

Anuj Sharma 20.03.2022 22:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
3
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующее работает для меня

object JacksonRun {
    @JvmStatic
    fun main(args: Array<String>) {
        val objMapper = ObjectMapper().apply {
            registerModule(KotlinModule())
        }
        val order = OrderNotesRequest()
        println(objMapper.writeValueAsString(order))
    }

}

data class OrderNotesRequest(
    @JsonSerialize(using = ZonedDateTimeSerialiser::class)
    val date: ZonedDateTime = ZonedDateTime.now()
)

class ZonedDateTimeSerialiser : JsonSerializer<ZonedDateTime>() {
    @Throws(IOException::class)
    override fun serialize(value: ZonedDateTime, gen: JsonGenerator, serializers: SerializerProvider?) {
        val parseDate: String = value.withZoneSameInstant(ZoneId.of("Europe/Warsaw"))
            .withZoneSameLocal(ZoneOffset.UTC)
            .format(DateTimeFormatter.ISO_DATE_TIME)
        gen.writeString(parseDate)
    }
}

build.gradle.kts:

dependencies {
    implementation("com.fasterxml.jackson.core:jackson-core:2.13.2")
    implementation("com.fasterxml.jackson.core:jackson-annotations:2.13.2")
    implementation("com.fasterxml.jackson.core:jackson-databind:2.13.2")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.0")
}

Дает мне вывод:

{"date":"2022-03-21T10:29:19.381498Z"}

Убедитесь, что у вас есть правильный импорт для JsonSerializer

import com.fasterxml.jackson.databind.JsonSerializer

и добавьте маркер override к методу serialize

это был импорт ?

sumek 21.03.2022 14:07

Другие вопросы по теме