客户端某次发版把 nonce 字段漏了,服务端 decodeFromString 抛 MissingFieldException: Field 'nonce' is required,整批事件回滚。这个字段在另一个 DTO 里有默认值,这个没有。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,kotlinx.serialization 把没有默认值且不可空的属性当成必填,解码时找不到键就抛异常,不会补 null。默认值必须写在属性声明上,运行时再赋值不算。
「kotlinx 缺字段反序列化」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。
@Serializable data class Event(val id: Long, val nonce: String = "") // 缺 nonce 时按默认值解码 不再抛 MissingFieldException
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,给可能缺失的字段补 = "" 或改成可空类型;确实必填的在入口处校验 返回明确的 400 而不是让异常冒到批次层;打开 ignoreUnknownKeys 处理上游新增字段;用一条缺字段的报文跑单测 确认走默认值而不是抛异常。
最后用这个标准收尾,缺 nonce 的报文能解码成功 nonce 是空串 批次不再整体回滚。
