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

Spring Boot中MapStruct映射所有字段为null的问题排查

MapStruct与Lombok适配问题解决方案

问题场景

  • 技术栈:Spring Boot 3.0.2、Java 17、Lombok 1.18.24、MapStruct 1.5.3.Final、IntelliJ IDEA 2022.2.4 + JPA Buddy 2022.5.4-222
  • 现象:实体类使用Lombok @Getter/@Setter生成访问器时,MapStruct生成的Mapper实现中toEntity、toDto、partialUpdate方法无法正确映射字段,所有字段值为null;移除Lombok注解后映射恢复正常。

解决方案

1. 调整依赖处理器执行顺序

MapStruct需要在Lombok生成访问器之后再生成映射代码,因此必须确保Lombok注解处理器优先于MapStruct执行。

Maven配置(pom.xml)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>17</source>
                <target>17</target>
                <annotationProcessorPaths>
                    <!-- Lombok处理器放在MapStruct之前 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.24</version>
                    </path>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.3.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle配置(build.gradle)

dependencies {
    implementation 'org.mapstruct:mapstruct:1.5.3.Final'
    // Lombok注解处理器优先声明
    annotationProcessor 'org.projectlombok:lombok:1.18.24'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
    compileOnly 'org.projectlombok:lombok:1.18.24'
}

2. 启用MapStruct对Lombok的显式支持

在项目配置中添加MapStruct的Lombok支持参数,确保MapStruct能识别Lombok生成的访问器:

<!-- pom.xml中添加属性配置 -->
<properties>
    <mapstruct.defaultComponentModel>spring</mapstruct.defaultComponentModel>
    <mapstruct.lombok.addon.enabled>true</mapstruct.lombok.addon.enabled>
</properties>

3. IntelliJ IDEA环境配置

  • 确保Lombok插件已启用:Settings > Plugins中搜索Lombok并确认启用。
  • 开启注解处理:Settings > Build, Execution, Deployment > Compiler > Annotation Processors,勾选Enable annotation processing。
  • 清理缓存并重建:File > Invalidate Caches...,选择Invalidate and Restart,之后执行Maven/Gradle Clean + Build操作。

4. 检查Lombok注解使用

  • 确保实体类上的@Getter/@Setter注解生效,可通过IntelliJ的Structure视图查看是否生成了对应的getter/setter方法。
  • 尝试替换为@Data注解(包含getter、setter、toString等),避免单独注解遗漏导致的访问器缺失。

问题原因

MapStruct生成映射代码时,依赖实体类的getter/setter方法完成字段赋值。如果Lombok的注解处理器晚于MapStruct执行,MapStruct在生成代码时无法识别Lombok后续生成的访问器,会默认认为没有可用的字段读写方法,最终导致映射结果全为null。

内容的提问来源于stack exchange,提问作者Rollins999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:45:46