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
相关产品推荐
相关产品推荐

