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
相关产品推荐
相关产品推荐

