Kotlin数据类实现接口:如何为atb设置条件默认值
问题分析
你遇到的反序列化错误,根源在于Jackson处理JSON缺失字段时,会尝试传递null给数据类构造函数的atb参数,但该参数被声明为非空Int类型,导致实例化失败。Java示例通过可空类型接收参数、再在构造逻辑中替换为bugId的方式解决了问题,Kotlin中可以复用类似思路,同时保留数据类的特性。
解决方案
通过私有可空参数接收JSON值,再通过override属性实现默认逻辑的方式,既满足接口的非空要求,又能处理缺失字段的情况,同时保留数据类的equals、hashCode、toString等特性:
data class PSR( @JsonDeserialize(using = DoubleToInt::class) override val bugId: Int, @JsonDeserialize(using = EpochToLocalDateTime::class) override val incidentDate: LocalDateTime, override val pillar: String, @JsonDeserialize(using = DoubleToInt::class) @JsonProperty("atb") private val _atb: Int? = null // 私有可空参数接收JSON的atb,默认值为null ) : Incident { override val source: String = "PSR" // 实现接口的非空atb属性,缺失时自动用bugId填充 override val atb: Int get() = _atb ?: bugId }
关键说明
- 可空参数接收:主构造函数中用
_atb: Int? = null接收JSON的atb字段,允许缺失时传入null,避免反序列化时的非空类型冲突。 - override属性处理逻辑:通过
override val atb: Int get() = _atb ?: bugId实现需求,当_atb为null时自动使用bugId的值,同时满足接口@get:Positive的验证要求(因为bugId本身已被@get:Positive约束)。 - 保留数据类特性:数据类自动生成的
equals、hashCode等方法会基于主构造函数的参数(包括_atb),完全符合数据类的特性。 - Jackson注解适配:
@JsonProperty("atb")确保Jackson将JSON中的atb字段正确映射到私有参数_atb,避免字段匹配异常。
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

