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

Kotlin中如何为含非空参数类的指定构造函数加注解适配MapStruct

实现方法

你不需要纠结怎么给@JvmOverloads自动生成的构造函数加注解,有两种稳定方案可以实现你要的映射逻辑:

方案1:手动声明指定构造加注解(全版本兼容)

直接在data class内显式定义仅传入非空必填参数的次构造,给这个构造加上MapStruct的@Default注解即可。Kotlin检测到签名一致的构造函数时,不会重复生成@JvmOverloads对应的重载,不会出现构造冲突。
代码示例:

import org.mapstruct.util.Default

data class TargetClass @JvmOverloads constructor(
    val nonNullable: String,
    var canBeNullable: Int? = null
) {
    // 标记这个构造为MapStruct优先选择的实例化构造
    @Default
    constructor(nonNullable: String) : this(nonNullable, null)
}

配置后MapStruct生成的代码完全符合预期:先调用单参构造传入非空字段创建实例,再通过setter方法给可空字段赋值。

方案2:用MapStruct官方Kotlin扩展(1.5.1+版本推荐)

如果你的MapStruct版本≥1.5.1,不需要加任何额外注解,也不需要写次构造,只要引入官方提供的mapstruct-kotlin依赖,框架会自动识别Kotlin data class的参数默认值、可空类型标记,自动选择最优实例化逻辑。
目标类保持最简洁的写法即可,不需要加@JvmOverloads和@Default:

data class TargetClass(
    val nonNullable: String,
    var canBeNullable: Int? = null
)

这种方式生成的映射代码和你期望的逻辑完全一致,没有冗余的全参构造调用。

踩坑提示

  • 不要直接把@Default加在主构造函数上,否则所有重载构造都会被标记,MapStruct会优先选择参数最多的全参构造,无法达到先实例化再赋值可空字段的效果
  • 注意@Default的包路径是org.mapstruct.util.Default,不要和其他框架的同名注解混淆

内容的提问来源于stack exchange,提问作者Andrzej Sawoniewicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20