Gradle Kotlin DSL下SpringBoot无法生成MapStruct Mapper实现类
MapStruct实现类生成失败,Spring无法找到对应Bean
技术栈版本
- Spring Boot: 2.7.5
- Kotlin: 1.7.21
- Gradle: 7.5.1
- IntelliJ IDEA 2022.2.3(旗舰版)
- Java 17
相关代码
1. build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.7.5" id("io.spring.dependency-management") version "1.0.11.RELEASE" val kotlinVersion = "1.7.21" kotlin("jvm") version kotlinVersion kotlin("plugin.spring") version kotlinVersion kotlin("kapt") version kotlinVersion } java.sourceCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_17 buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-noarg:1.4.21") classpath("net.ltgt.gradle:gradle-apt-plugin:0.21") } } apply(plugin = "kotlin-jpa") apply(plugin = "net.ltgt.apt-idea") dependencies { val querydslVersion = "5.0.0" implementation("org.springframework.boot:spring-boot-starter-data-mongodb") api("com.querydsl:querydsl-apt:$querydslVersion") kapt("com.querydsl:querydsl-jpa:$querydslVersion") val mapstructVersion = "1.5.3.Final" implementation("org.mapstruct:mapstruct:$mapstructVersion") kapt("org.mapstruct:mapstruct-processor:$mapstructVersion") } kapt { annotationProcessor("org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor") // arguments { // Set Mapstruct Configuration options here // arg("mapstruct.defaultComponentModel", "spring") // } } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = JavaVersion.VERSION_17.toString() } } tasks.withType<Test> { useJUnitPlatform() }
2. DomainModelMapper.kt
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.WARN) interface DomainModelMapper { @Mappings( Mapping(source = "firstName", target = "first_name"), Mapping(source = "lastName", target = "last_name"), ) fun accountCreateToAccount(accountCreate:AccountCreateRequest):Account }
异常信息
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.*****.backend.config.DomainModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
已尝试操作
- 已在IntelliJ IDEA中开启注解处理
- 项目未使用Lombok
- 已查阅MapStruct官方文档、Spring扩展插件说明、Stack Overflow相关回答及技术博客,问题仍未解决
解决方案建议
1. 修正Kapt配置,确保MapStruct处理器生效
在kapt配置块中显式声明MapStruct处理器并添加配置参数,避免注解处理逻辑遗漏:
kapt { annotationProcessor("org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor") annotationProcessor("org.mapstruct:mapstruct-processor:1.5.3.Final") arguments { arg("mapstruct.defaultComponentModel", "spring") arg("mapstruct.unmappedTargetPolicy", "WARN") } }
2. 修正QueryDSL依赖(适配MongoDB场景)
当前依赖中引入了JPA版本的QueryDSL,但项目使用MongoDB,存在依赖不匹配问题,替换为MongoDB对应依赖:
dependencies { val querydslVersion = "5.0.0" implementation("org.springframework.boot:spring-boot-starter-data-mongodb") implementation("com.querydsl:querydsl-mongodb:$querydslVersion") kapt("com.querydsl:querydsl-apt:$querydslVersion:mongodb") val mapstructVersion = "1.5.3.Final" implementation("org.mapstruct:mapstruct:$mapstructVersion") kapt("org.mapstruct:mapstruct-processor:$mapstructVersion") }
错误的QueryDSL依赖可能干扰注解处理器执行,导致MapStruct无法生成实现类。
3. 统一Kotlin版本
buildscript中kotlin-noarg版本为1.4.21,与项目Kotlin 1.7.21版本不一致,存在兼容性风险,修改为一致版本:
buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-noarg:1.7.21") classpath("net.ltgt.gradle:gradle-apt-plugin:0.21") } }
4. 清理缓存并重新构建
执行Gradle命令清理旧构建产物并重新编译:
./gradlew clean build --no-build-cache
同时在IntelliJ IDEA中执行File -> Invalidate Caches... -> Invalidate and Restart,清除IDE缓存。
5. 检查实现类生成与Spring扫描范围
编译后查看build/generated/sources/kapt/main目录,确认是否生成DomainModelMapperImpl类:
- 若未生成:说明注解处理器未触发,需再次检查依赖和配置
- 若已生成但Spring无法扫描:确保Mapper所在包被Spring组件扫描覆盖(可在启动类添加
@ComponentScan(basePackages = ["com.*****.backend.config"]))
内容的提问来源于stack exchange,提问作者sd1517
相关产品推荐
相关产品推荐

