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

