MapStruct多源参数映射时如何跳过源全空返回null的校验
首先澄清你贴出的自动生成代码的默认逻辑已经匹配你的需求:
生成代码中的判断条件为 source1== null && source2== null && source3== null,仅当三个入参全部为null时才会返回null,只要source2不为null,哪怕source1、source3全为null,也不会触发返回null的分支,会正常实例化SomeClass对象,将source2的address字段赋值到目标对象,其余来源为null的字段直接赋值为null,完全符合你的要求。
如果你实际运行中不符合该逻辑,或需要调整空映射的返回规则,可以用MapStruct原生支持的配置实现:
场景1:需要修改默认空判断逻辑(即使所有入参全为null也返回空对象而非null)
可以通过配置nullValueMappingStrategy实现:
- 单个Mapper生效:
给对应的Mapper接口的@Mapper注解添加配置:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.NullValueMappingStrategy; @Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT) public interface SomeMapper { @Mappings({ @Mapping(source = "source1.name", target = "name"), @Mapping(source = "source2.address", target = "address"), @Mapping(source = "source3.company", target = "company") }) SomeClass map(Source1 source1, Source2 source2, Source3 source3); }
- 全局生效:
在项目的编译配置中添加MapStruct全局编译参数,以Maven为例:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-Amapstruct.nullValueMappingStrategy=RETURN_DEFAULT</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
配置后生成的实现类会删除全空返回null的判断,无论入参是否为null,都会先实例化目标对象再执行字段映射。
场景2:实际生成的判断条件为或逻辑(任意入参为null就返回null)
该情况通常是你使用的MapStruct版本低于1.3,升级MapStruct到1.3及以上稳定版本即可,高版本默认多参数映射的空判断逻辑就是全空才返回null。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

