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

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
}
关键说明
  1. 可空参数接收:主构造函数中用_atb: Int? = null接收JSON的atb字段,允许缺失时传入null,避免反序列化时的非空类型冲突。
  2. override属性处理逻辑:通过override val atb: Int get() = _atb ?: bugId实现需求,当_atb为null时自动使用bugId的值,同时满足接口@get:Positive的验证要求(因为bugId本身已被@get:Positive约束)。
  3. 保留数据类特性:数据类自动生成的equals、hashCode等方法会基于主构造函数的参数(包括_atb),完全符合数据类的特性。
  4. Jackson注解适配:@JsonProperty("atb")确保Jackson将JSON中的atb字段正确映射到私有参数_atb,避免字段匹配异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33