一、问题现象

在使用 MapStruct + Lombok + Builder 模式 时,发现 IDEA Run 编译 和 Maven compile 生成的代码不一致:

编译方式生成代码映射字段
IDEA RunSetter 模式(new Object(); setXxx()✅ 映射所有字段(包括父类)
Maven compileBuilder 模式(Builder.builder().xxx()✅ 只映射子类字段

再有的场景下,会导致代码出错,比如使用jpa时, 如果转换对象是,copy了id,save 会从复制变为更新操作,所以要特别注意。

二、根本原因

IDEA 和 Maven 使用了不同的注解处理器配置:

  1. IDEA 内置了 Lombok 和 MapStruct 的智能支持,默认使用 Setter 模式并自动映射所有字段

  2. Maven 严格按照 pom.xml 中的 annotationProcessorPaths 配置执行,默认使用 Builder 模式(如果类有 @Builder)并只映射当前类声明的字段

关键差异点:

  • lombok-mapstruct-binding 依赖的有无会显著影响生成策略

  • 不同版本的 MapStruct 对 Builder 的支持程度不同

  • 父类字段的访问修饰符(private vs protected)会影响映射行为

三、解决方法:

// todo

IDEA 2024.3.4 设置了 Compiler 相关配置没有生效。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐