MapStruct是否支持生成Kotlin类?配置后仅生成Java代码的问题求助
MapStruct是否支持生成Kotlin类?配置后仅生成Java代码的问题求助
先给你理清楚问题的来龙去脉,以及对应的解决方案:
1. 关于“org.mapstruct”Gradle插件的问题
你说得完全对,这个插件根本不存在——MapStruct是基于注解处理器工作的,不需要专门的Gradle插件来支撑运行,所以你删掉这个插件的操作是完全正确的。
2. 为什么只生成Java代码?
目前MapStruct的核心是基于Java注解处理器实现的,所以它默认生成的就是Java实现类。不过别担心,这些Java类和你的Kotlin代码可以无缝协作,不会有任何兼容性问题。
那有没有办法让MapStruct直接生成Kotlin类呢?
目前官方还没有提供直接生成Kotlin实现类的功能,社区里虽然有一些非官方的尝试,但稳定性没法保证,所以更推荐你用官方认可的方式:让MapStruct生成Java类,和Kotlin代码配合使用,这在实际项目里是完全可行的方案。
3. 修正你的Gradle配置(Kotlin DSL)
给你调整了一份正确的配置,确保MapStruct能和你的Kotlin项目正常协作:
plugins { kotlin("jvm") version "1.9.0" kotlin("kapt") version "1.9.0" } kapt { arguments { arg("mapstruct.defaultComponentModel", "spring") arg("mapstruct.unmappedTargetPolicy", "IGNORE") } } dependencies { implementation("org.mapstruct:mapstruct:1.5.5.Final") // 只保留kapt依赖即可,annotationProcessor是给纯Java项目用的,Kotlin项目不需要 kapt("org.mapstruct:mapstruct-processor:1.5.5.Final") }
4. 额外的注意事项
- 你的Kotlin实体类和Mapper接口使用MapStruct注解的方式和Java几乎一致,比如
@Mapper、@Mapping这些注解都能直接用 - 确保你的Kotlin类属性是
open的(如果用Spring的话,Spring插件已经集成了all-open功能,会自动处理类和属性的开放性),否则MapStruct可能无法正确访问属性 - 构建项目时,执行
kaptKotlin任务,MapStruct就会在编译阶段生成对应的Java实现类,你可以在Kotlin代码里直接调用这些类,完全没有障碍
总结一下:虽然没法直接生成Kotlin实现类,但生成的Java类和Kotlin代码配合起来完全顺畅,而且这是官方推荐的稳定方案,在绝大多数Kotlin项目里都是这么用的。
内容来源于stack exchange
相关产品推荐
相关产品推荐

