Mapstruct unmappedTargetPolicy WARN配置无效果问题咨询
问题分析与解决方案
嘿,我刚看完你的问题,其实是对MapStruct的两个配置参数的作用搞混了,这才导致你没看到预期的警告。让我给你拆解清楚:
核心问题:你用错了配置参数
你现在设置的mapstruct.unmappedTargetPolicy,它的作用是检测目标DTO类里存在但没有被任何源字段映射的字段。而你的场景正好相反:是源类里的noMappingDefined字段没有映射到目标类的任何字段,这种情况要检测的话,得用mapstruct.unmappedSourcePolicy这个参数。
这就解释了为什么你设unmappedTargetPolicy=WARN时没收到警告——因为你的SimpleDestination里的所有字段(field1、field2)都已经被正确映射了,根本没有未被映射的目标字段,自然不会触发警告。而改成ERROR时构建失败,可能是你项目里其他Mapper存在目标字段未映射的情况,但这不是你当前问题的重点。
解决办法:换用unmappedSourcePolicy
你只需要把编译参数换成mapstruct.unmappedSourcePolicy=WARN,这样当源类中有字段没被映射到目标类时,构建过程就会输出警告提示了。
修改后的POM配置
<configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.3.0.Beta2</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> <compilerArgs> <compilerArg> -Amapstruct.defaultComponentModel=spring </compilerArg> <!-- 换成这个参数就能检测源字段未映射的情况 --> <compilerArg> -Amapstruct.unmappedSourcePolicy=WARN </compilerArg> <!-- 如果同时想检测目标字段未映射的情况,可以保留这行 --> <!-- <compilerArg> -Amapstruct.unmappedTargetPolicy=WARN </compilerArg> --> </compilerArgs> </configuration>
或者在单个Mapper上配置(更灵活)
如果你只想针对这个TestMapper生效,也可以直接在注解里设置:
@Mapper(unmappedSourcePolicy = ReportingPolicy.WARN) public interface TestMapper { @Mapping(source = "firstField", target = "field1") @Mapping(source = "secondField", target = "field2") SimpleDestination sourceToDestination(SimpleSource source); @InheritInverseConfiguration SimpleSource destinationToSource(SimpleDestination destination); }
额外提醒
- MapStruct的
ReportingPolicy有三个级别:IGNORE(默认不提示)、WARN(输出警告)、ERROR(直接失败) - 对于你这种有大量字段要映射的场景,非常建议同时开启
unmappedSourcePolicy=WARN和unmappedTargetPolicy=WARN,这样不管是漏了映射源字段还是目标字段,都会收到提示,能有效避免遗漏。
内容的提问来源于stack exchange,提问作者Old Nick




