You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Mapstruct unmappedTargetPolicy WARN配置无效果问题咨询

问题分析与解决方案

嘿,我刚看完你的问题,其实是对MapStruct的两个配置参数的作用搞混了,这才导致你没看到预期的警告。让我给你拆解清楚:

核心问题:你用错了配置参数

你现在设置的mapstruct.unmappedTargetPolicy,它的作用是检测目标DTO类里存在但没有被任何源字段映射的字段。而你的场景正好相反:是源类里的noMappingDefined字段没有映射到目标类的任何字段,这种情况要检测的话,得用mapstruct.unmappedSourcePolicy这个参数。

这就解释了为什么你设unmappedTargetPolicy=WARN时没收到警告——因为你的SimpleDestination里的所有字段(field1field2)都已经被正确映射了,根本没有未被映射的目标字段,自然不会触发警告。而改成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=WARNunmappedTargetPolicy=WARN,这样不管是漏了映射源字段还是目标字段,都会收到提示,能有效避免遗漏。

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

火山引擎 最新活动