Force Milliseconds When Serializing Instant to ISO8601 using Jackson

前端 未结 5 637
野的像风
野的像风 2021-01-11 15:01

I have some questions related to JSON serialization using Jackson in a project where I use Spring Boot 2.0.0.M6, Spring Framework 5.0.1.R

5条回答
  •  滥情空心
    2021-01-11 15:21

    Solve it by using custom serializers for LocalDateTime and ZonedDateTime classes.

    My solution works for me because I use only these two classes in API responses to represent date and time! I don't use Instant or Date so pay attention on it.

    @Configuration
    class JacksonConfig {
    
    @Bean
    fun objectMapper(): ObjectMapper {
        val mapper = ObjectMapper()
        val javaTimeModule = JavaTimeModule().apply {
            addSerializer(LocalDateTime::class.java, KeepMillisecondLocalDateTimeSerializer())
            addSerializer(ZonedDateTime::class.java, KeepMillisecondZonedDateTimeSerializer())
        }
        mapper.registerModule(javaTimeModule)
        return mapper
    }
    
    class KeepMillisecondZonedDateTimeSerializer : JsonSerializer() {
        private val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
    
        @Throws(IOException::class)
        override fun serialize(
            value: ZonedDateTime,
            jsonGenerator: JsonGenerator,
            serializerProvider: SerializerProvider?
        ) {
            jsonGenerator.writeString(formatter.format(value))
        }
    }
    
    class KeepMillisecondLocalDateTimeSerializer : JsonSerializer() {
        private val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
    
        @Throws(IOException::class)
        override fun serialize(
            value: LocalDateTime,
            jsonGenerator: JsonGenerator,
            serializerProvider: SerializerProvider?
        ) {
            jsonGenerator.writeString(formatter.format(value))
        }
    }
    }
    

提交回复
热议问题