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

使用MapStruct时遭遇ClassNotFoundException问题求助

解决MapStruct ClassNotFoundException(找不到实现类)问题

问题根源分析

你的问题主要来自三个核心点:

  1. Spring组件模型与MapStruct工厂模式冲突:使用@Mapper(componentModel = "spring")时,MapStruct会生成Spring托管的Bean,但你同时用Mappers.getMapper()获取实例,两种实例管理方式矛盾,导致无法正确加载实现类。
  2. 注解处理器顺序错误:Gradle中annotationProcessor的执行顺序会直接影响处理结果,Lombok处理器必须先于MapStruct执行,否则MapStruct无法识别Lombok自动生成的getter/setter方法。
  3. 目标实体缺少必要构造方法: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:22:38