如何让Kotlin数据类中@JsonUnwrapped注解实现反序列化?
Kotlin数据类中Jackson @JsonUnwrapped反序列化问题解决
你遇到的问题是:使用@JsonUnwrapped注解的Kotlin数据类可以正常序列化,但反序列化时抛出错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 无法将Creator属性"property name"定义为@JsonUnwrapped:暂不支持该组合
原因很明确:Kotlin数据类的主构造器参数会被Jackson识别为Creator属性,而Jackson目前不支持在Creator属性上搭配@JsonUnwrapped使用。
除了自定义反序列化器,还有两种简易方案可以解决:
方案一:将@JsonUnwrapped属性移至类体,改用无参构造器
把原本放在主构造器的@JsonUnwrapped属性移到类体中,同时确保类有可被Jackson识别的无参构造器(可借助kotlin-noarg插件自动生成):
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) @JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class) @Schema(description = "Customer Details", allOf = [Address::class, Person::class]) data class CustomerDetails() { @JsonUnwrapped var addressDetails: Address? = null @JsonUnwrapped var personDetails: Person? = null }
注意:这种方式下数据类的equals/hashCode逻辑会基于空构造器的初始状态,若需要保留原有的属性对比逻辑,可手动重写equals和hashCode方法。
方案二:改用普通类+@JsonCreator手动映射构造器
放弃数据类,改用普通类,通过@JsonCreator注解手动编写构造器,将扁平化的JSON字段映射到对应的嵌套属性中:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) @JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class) @Schema(description = "Customer Details", allOf = [Address::class, Person::class]) class CustomerDetails { @JsonUnwrapped val addressDetails: Address? @JsonUnwrapped val personDetails: Person? @JsonCreator constructor( houseNumber: Int?, streetName: String?, city: String?, firstName: String?, lastName: String?, initials: String? ) { addressDetails = Address(houseNumber, streetName, city) personDetails = Person(firstName, lastName, initials) } }
这种方式完全由手动控制字段映射,能精准匹配扁平化的JSON结构,同时保留@JsonUnwrapped的序列化效果。
内容的提问来源于stack exchange,提问作者firstpostcommenter
相关产品推荐
相关产品推荐

