You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Kotlin+Jackson全局Long类型序列化失效问题解决

问题解决:SpringBoot 3.0.6+Kotlin+Jackson全局Long转String不全生效的问题

问题场景

在SpringBoot 3.0.6环境下结合Kotlin开发时,通过配置类全局设置Jackson将Long类型序列化为String,但仅非空Long字段(如Kotlin类Person的id: Long)生效,可空Long字段(如Kotlin类Student的id: Long?)以及Java类(如Product)中的Long字段均未生效。

原因分析

Jackson对Java基本类型(long)和包装类型(java.lang.Long)的处理逻辑是分离的:

  • Kotlin中的非空Long会被编译为Java基本类型long,仅配置Long::class.java(对应long.class)时,这类字段能生效;
  • Kotlin中的可空Long?会编译为Java的java.lang.Long包装类,Java类中的Long字段本身也是包装类型,此时必须同时配置Long::class.javaObjectType(对应Long.class)才能覆盖这类场景。

解决方案

在Jackson全局配置类中,同时为Long::class.java和Long::class.javaObjectType注册ToStringSerializer,示例代码如下:

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilderCustomizer

@Configuration
class JacksonConfig {

    @Bean
    fun jackson2ObjectMapperBuilderCustomizer(): Jackson2ObjectMapperBuilderCustomizer {
        return Jackson2ObjectMapperBuilderCustomizer { builder ->
            // 处理Java基本类型long转String
            builder.serializerByType(Long::class.java, ToStringSerializer.instance)
            // 处理Java包装类型Long(对应Kotlin可空Long?和Java类的Long字段)转String
            builder.serializerByType(Long::class.javaObjectType, ToStringSerializer.instance)
        }
    }
}

配置完成后,所有场景下的Long类型(非空Kotlin Long、可空Kotlin Long?、Java类的Long)都会被序列化为String类型。

内容的提问来源于stack exchange,提问作者SageJustus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:01