Mapstruct搭配Gradle运行gradlew bootrun时找不到FooMapper Bean问题
MapStruct Gradle 命令行启动未生成实现类解决方案
报错说明
你遇到的启动报错如下:
*************************** 应用启动失败
描述:
ServiceImpl中的fooMapper字段需要类型为'FooMapper'的Bean,但该Bean无法找到。
注入点存在以下注解:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
操作建议:
请在你的配置中定义类型为'FooMapper'的Bean。
根因分析
该问题是IDE与Gradle命令行的注解处理逻辑不一致导致:
- Eclipse下
com.diffplug.eclipse.apt插件自动识别了Groovy文件的注解处理需求,所以Mapper实现类可以正常生成 - 命令行执行Gradle任务时,仅为Java编译任务配置了MapStruct注解处理器,Groovy编译任务未触发注解处理,导致实现类缺失
- 配置的源码生成目录路径不准确,生成的类未被纳入编译类路径
修复方案
步骤1:新增Groovy编译任务的注解处理配置
在build.gradle中新增GroovyCompile任务的参数配置,显式指定注解处理器路径:
tasks.withType(GroovyCompile) { options.compilerArgs = [ "-Amapstruct.suppressGeneratorTimestamp=true", "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.verbose=true" ] options.annotationProcessorPath = configurations.annotationProcessor }
步骤2:修正源码集配置
替换原有的sourceSets配置,指向正确的注解处理器生成目录:
sourceSets { main { groovy { // 同时兼容Groovy和Java生成的注解处理器产物 srcDirs += "build/generated/sources/annotationProcessor/groovy/main" srcDirs += "build/generated/sources/annotationProcessor/java/main" } } }
步骤3:验证修复效果
执行以下命令验证配置生效:
gradlew clean compileGroovy:检查build/generated/sources/annotationProcessor目录下是否生成了FooMapperImpl实现类gradlew bootRun:正常启动服务无注入报错
完整修改后build.gradle参考
plugins { id "org.springframework.boot" id "groovy" id "com.diffplug.eclipse.apt" version "3.31.0" } configurations { // 配置项支持本地使用内嵌h2数据库运行bootRun runlocal } ext { mapstructVersion = "1.5.0.Beta1" } dependencies { implementation "org.mapstruct:mapstruct:${mapstructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" testImplementation "org.testng:testng:6.10", "org.easytesting:fest-assert:1.4" implementation project(":common") implementation "org.springframework.boot:spring-boot-starter-web:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-validation:$springBootVersion" implementation "org.codehaus.gpars:gpars:1.2.1" developmentOnly "org.springframework.boot:spring-boot-devtools:$springBootVersion" runlocal project(":test-db") testImplementation project(":test-db") } sourceSets { main { groovy { srcDirs += "build/generated/sources/annotationProcessor/groovy/main" srcDirs += "build/generated/sources/annotationProcessor/java/main" } } } bootRun { classpath = sourceSets.main.runtimeClasspath + configurations.runlocal } tasks.withType(JavaCompile) { options.compilerArgs = [ "-Amapstruct.suppressGeneratorTimestamp=true", "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.verbose=true" ] } tasks.withType(GroovyCompile) { options.compilerArgs = [ "-Amapstruct.suppressGeneratorTimestamp=true", "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.verbose=true" ] options.annotationProcessorPath = configurations.annotationProcessor }
内容的提问来源于stack exchange,提问作者Femi Oyenusi
相关产品推荐
相关产品推荐

