使用MapStruct时遭遇ClassNotFoundException问题求助
解决MapStruct ClassNotFoundException(找不到实现类)问题
问题根源分析
你的问题主要来自三个核心点:
- Spring组件模型与MapStruct工厂模式冲突:使用
@Mapper(componentModel = "spring")时,MapStruct会生成Spring托管的Bean,但你同时用Mappers.getMapper()获取实例,两种实例管理方式矛盾,导致无法正确加载实现类。 - 注解处理器顺序错误:Gradle中
annotationProcessor的执行顺序会直接影响处理结果,Lombok处理器必须先于MapStruct执行,否则MapStruct无法识别Lombok自动生成的getter/setter方法。 - 目标实体缺少必要构造方法:
TestEntity仅通过@Builder生成构造逻辑,没有无参构造方法,MapStruct默认要求目标类具备无参构造(除非显式配置使用Builder)。
具体修复步骤
1. 修正TestMapper代码(适配Spring托管)
移除Mappers.getMapper()的实例声明,让Spring负责管理Mapper实例:
import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface TestMapper { TestEntity toTest(TestDto testDto); }
2. 调整Gradle依赖配置(修正处理器顺序)
确保Lombok相关处理器优先执行,调整后的依赖配置如下:
dependencies { // MapStruct核心依赖 implementation 'org.mapstruct:mapstruct:1.4.2.Final' // Lombok核心依赖(仅编译时生效) compileOnly 'org.projectlombok:lombok' // Lombok与MapStruct绑定依赖 compileOnly 'org.projectlombok:lombok-mapstruct-binding:0.2.0' // 注解处理器:顺序必须是Lombok → 绑定 → MapStruct annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0' annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' }
3. 修正TestService代码(使用Spring依赖注入)
通过构造方法注入TestMapper,替代工厂模式获取实例:
@Service public class TestService { private final TestMapper testMapper; // 构造方法注入(Spring推荐的依赖注入方式) public TestService(TestMapper testMapper) { this.testMapper = testMapper; } public void mapstructTest() { TestDto dto = new TestDto(); dto.setId(1L); dto.setName("test name"); TestEntity test = testMapper.toTest(dto); test.toString(); } }
4. 补充TestEntity的无参构造方法
给TestEntity添加无参构造(配合Lombok的@NoArgsConstructor),确保MapStruct可以正常实例化对象:
@Builder @Getter @ToString @Entity @NoArgsConstructor @AllArgsConstructor public class TestEntity { private Long id; private String name; }
5. 验证注解处理器执行
- 执行Gradle的
compileJava任务,或者直接运行./gradlew build(Windows环境用gradlew.bat build) - 检查
build/generated/sources/annotationProcessor/java/main/com/example/wechall/test/目录下是否生成了TestMapperImpl类,若存在则说明注解处理成功 - 若使用IntelliJ IDEA,需开启注解处理器:
File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors,勾选Enable annotation processing
内容的提问来源于stack exchange,提问作者stonage
相关产品推荐
相关产品推荐

