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

Kotlin环境下使用MapStruct实现多源到单模型映射时@Mapping注解不可重复的问题求助

解决Kotlin中MapStruct多个@Mapping注解报错的问题

这个问题我之前在Kotlin项目里用MapStruct的时候也踩过坑,其实就是Kotlin和Java对重复注解的处理方式不一样导致的,咱们一步步来解决:

问题根源

在Java中,MapStruct的@Mapping注解是被@Repeatable标记的可重复注解,所以可以直接在方法上多次标注。但Kotlin对Java的重复注解支持需要显式使用容器注解@Mappings来包裹多个@Mapping,否则编译器就会抛出"This annotation is not repeatable."的错误——毕竟MapStruct官方文档大多是Java示例,很容易忽略这个Kotlin特有的细节。

具体解决步骤

1. 用@Mappings包裹所有@Mapping注解

这是最直接的修复方式,把你需要的所有字段映射规则放在@Mappings的value数组里,代码示例如下:

import org.mapstruct.Mapping
import org.mapstruct.Mappings
import org.mapstruct.BeanMapping
import org.mapstruct.Mapper

@Mapper
interface PersonMapper {
    @Mappings(
        Mapping(source = "personDetails.dateOfBirth", target = "dateOfBirth"),
        Mapping(source = "personDocuments.licenseNumber", target = "licenseNumber")
    )
    @BeanMapping(ignoreUnmappedSourceProperties = ["weight", "height", "eyeColor", "passportNumber", "socialSecurityNumber"])
    fun personToModel(
        personInfo: PersonInfo,
        personDetails: PersonDetails,
        personDocuments: PersonDocuments
    ): MyModel
}

2. 修正ignoreUnmappedSourceProperties的写法

你代码里的[不需要的其他属性]要改成Kotlin的字符串数组形式,把所有不需要映射的源属性逐个列出来,就像上面示例中那样,这样MapStruct才能正确忽略那些多余的属性。

3. 确保MapStruct版本适配

建议使用MapStruct 1.4.0及以上版本,这些版本对Kotlin的支持更完善,能减少这类兼容性问题。以Kotlin的Gradle构建为例,你可以在build.gradle.kts中确认依赖版本:

dependencies {
    implementation("org.mapstruct:mapstruct:1.5.5.Final")
    kapt("org.mapstruct:mapstruct-processor:1.5.5.Final")
}

补充说明

如果你的Kotlin版本在1.6及以上,其实可以开启对Java重复注解的隐式支持,但目前MapStruct官方还是推荐显式使用@Mappings来保证跨环境的兼容性,避免出现奇怪的编译问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:22:29