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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:09