Mapstruct 1.2.0升级1.4.2兼容问题及Lombok @With注解相关问题咨询
MapStruct 1.2.0升级1.4.2兼容性问题解决方案
以下针对你遇到的两处兼容性问题分别给出解决方案:
问题1:映射源无法识别setter方法、要求属性真实存在
MapStruct从1.3版本开始调整了默认的属性扫描规则,默认不再将setter方法识别为合法的映射源,要求映射对应的属性必须为类中真实存在的字段。
解决方式如下:
- 全局兼容方案:添加编译参数
-Amapstruct.allowSetterAsSource=true,开启setter方法作为映射源的支持,完全兼容1.2.0版本的旧逻辑。 - 单Mapper兼容方案:如果仅个别Mapper用到了setter作为映射源,可在对应的
@Mapper注解中配置unmappedSourcePolicy = ReportingPolicy.IGNORE,忽略源属性不存在的报错。
问题2:Lombok @With注解导致需要新增大量映射规则
Lombok的@With注解会生成withXXX前缀的方法,符合MapStruct默认的访问器方法识别规则,因此MapStruct会将这些方法识别为属性的存取方法,进而要求你补充对应的映射规则。
解决方式如下:
- 全局最优方案:添加编译参数
-Amapstruct.accessorNaming.excludedPrefixes=with,让MapStruct扫描访问器方法时自动排除with前缀的方法,不会识别Lombok生成的with方法,完全不需要额外配置映射规则,同时不影响正常的属性映射校验。 - 临时兼容方案:如果不需要做未映射属性校验,可在
@Mapper注解中配置unmappedTargetPolicy = ReportingPolicy.IGNORE,直接忽略所有未映射目标属性的报错。
编译参数配置示例
Maven配置
在pom.xml的maven-compiler-plugin配置中添加以下内容:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-Amapstruct.allowSetterAsSource=true</arg> <arg>-Amapstruct.accessorNaming.excludedPrefixes=with</arg> </compilerArgs> </configuration> </plugin>
Gradle配置
在build.gradle的compileJava任务中添加以下内容:
compileJava { options.compilerArgs += [ '-Amapstruct.allowSetterAsSource=true', '-Amapstruct.accessorNaming.excludedPrefixes=with' ] }
注意:推荐优先使用全局编译参数的方案,既可以解决兼容性问题,也不会关闭MapStruct默认的未映射属性校验能力,避免漏掉需要映射的属性。
内容的提问来源于stack exchange,提问作者Daniel Jipa
相关产品推荐
相关产品推荐

