Mapstruct转换ServiceAddress对象时未映射addLine1字段问题排查求助
问题原因
- 最常见的原因是Lombok与MapStruct的注解处理器执行顺序错误:MapStruct编译阶段需要依赖字段的getter/setter方法完成映射逻辑生成,如果注解处理器中MapStruct的执行顺序早于Lombok,Lombok还没生成
addLine1、addLine2对应的getter方法,MapStruct就会认为这两个字段没有可读的访问方法,直接跳过映射。 - 其次是版本兼容性问题:如果使用的Lombok版本低于1.18.16,或者MapStruct版本低于1.4.0,两者的注解处理器适配存在缺陷,也会导致字段识别异常。
- 少数情况是类导入错误:源和目标类同名都叫
ServiceAddress,如果Mapper接口中导包错误,误将两个类的类型匹配混了,也会出现字段识别不到的问题。
解决方案
1. 调整注解处理器的执行顺序
如果是Maven项目,在maven-compiler-plugin的配置中,将Lombok的注解处理器放在MapStruct之前,示例配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessorPaths> <!-- 先配置Lombok --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <!-- 再配置MapStruct绑定包 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </path> <!-- 最后配置MapStruct --> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin>
如果是Gradle项目,调整annotationProcessor的依赖顺序:
dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' // 其他业务依赖 }
2. 升级兼容版本
建议使用以下版本组合,避免兼容性问题:
- Lombok >= 1.18.16
- MapStruct >= 1.4.0.Final
- lombok-mapstruct-binding >= 0.2.0
3. 显式指定字段映射(兜底方案)
如果调整配置后仍有问题,可以在Mapper方法上加上@Mapping注解显式指定字段映射,强制MapStruct生成对应逻辑:
@Mapper(componentModel = "spring") public interface TestMapper { @Mapping(source = "addLine1", target = "addLine1") @Mapping(source = "addLine2", target = "addLine2") ServiceAddress toServiceAddress(OrderDTO.OrderElement.ServiceAddress serviceAddress); }
4. 检查导包正确性
确认Mapper接口中导入的源ServiceAddress是OrderDTO.OrderElement.ServiceAddress,目标是你定义的目标类,没有导错同名类。
内容的提问来源于stack exchange,提问作者behrad nasehi
相关产品推荐
相关产品推荐

