Spring Boot结合Kotlin使用@JsonComponent时isAdmin字段JSON序列化丢失问题
问题触发原因
- 根本原因是Jackson默认遵循的Java Bean命名规范,与Kotlin数据类自动生成的Getter方法命名逻辑产生了冲突:
- Java Bean规范规定:只有返回原生
boolean/包装类Boolean类型的isXxx()格式方法,才会被识别为对应属性的Getter;非布尔类型的属性Getter必须是getXxx()格式才会被默认识别。 - Kotlin对所有以
is开头的val属性,无论属性类型是什么,都会自动生成isXxx()格式的Getter方法。 - 你的
isAdmin字段类型是自定义的BooleanValue,不是布尔类型,Jackson会把自动生成的isAdmin()方法判定为非合法Getter,认为HaveBoolean类没有可序列化的公开属性,最终返回空JSON{}。 - 当你把字段名改为
hoge后,Kotlin自动生成的Getter是符合非布尔类型规则的getHoge(),Jackson可以正常识别,因此序列化结果正常。
- Java Bean规范规定:只有返回原生
解决方案
你可以选择以下任意一种方式解决问题:
- 给
isAdmin字段添加@JsonProperty注解,强制Jackson识别该序列化属性:
data class HaveBoolean( @get:JsonProperty("isAdmin") val isAdmin: BooleanValue, )
- 调整Jackson全局序列化配置,允许非布尔类型的
isXxx()方法被识别为Getter,Spring Boot项目可以在application.yml中添加如下配置:
spring: jackson: mapper: allow-is-getter-for-non-boolean: true
- 调整非布尔类型字段的命名规则,避免使用
is作为前缀,从根源上避免命名冲突。
内容的提问来源于stack exchange,提问作者sho
相关产品推荐
相关产品推荐

