Mapstruct如何全局忽略字段?避免新增映射时遗漏配置
关于MapStruct忽略字段及避免不必要查询的解决方案
当然可以用@Mapping(ignore = true, target = "xxx")来忽略特定字段,这正是MapStruct用来跳过字段映射的标准用法,能有效避免触发懒加载关联的数据库查询。
针对你担心新增映射方法时忘加ignore注解的问题,推荐两种更省心的全局配置方案,不用每个方法都手动加注解:
方案1:全局忽略所有未显式映射的字段
在Mapper接口上关联一个配置类,设置unmappedTargetPolicy = ReportingPolicy.IGNORE,这样MapStruct会自动忽略所有你没在@Mapping里明确指定的目标字段,从根源避免漏加ignore的问题。
示例代码:
@Mapper(componentModel = "spring", config = DefaultMapperConfig.class) public interface ModelMapper { // 只显式映射需要的字段,其他未指定的字段(比如ccc)自动忽略 @Mapping(target = "aaa", source = "bbb") ResultObject mapToResultObject(Window window); // 当需要ccc字段时,显式添加映射配置即可覆盖全局忽略规则 @Mapping(target = "aaa", source = "bbb") @Mapping(target= "ccc", source= "ccc") ResultObject mapToResultObjectWithCcc(Window window); } // 全局配置类 @MapperConfig(unmappedTargetPolicy = ReportingPolicy.IGNORE) interface DefaultMapperConfig {}
方案2:针对特定字段全局默认忽略
如果只是想针对某个特定字段(比如你的ccc)默认忽略,其他字段正常自动映射,可以在全局配置里直接指定该字段的忽略规则,只有需要映射时再单独覆盖。
示例代码:
@Mapper(componentModel = "spring", config = DefaultMapperConfig.class) public interface ModelMapper { // 全局配置已默认忽略ccc,无需额外加ignore注解 @Mapping(target = "aaa", source = "bbb") ResultObject mapToResultObject(Window window); // 显式添加ccc的映射,覆盖全局忽略规则 @Mapping(target = "aaa", source = "bbb") @Mapping(target= "ccc", source= "ccc") ResultObject mapToResultObjectWithCcc(Window window); } // 全局配置类,指定默认忽略ccc字段 @MapperConfig(mappings = @Mapping(target = "ccc", ignore = true)) interface DefaultMapperConfig {}
两种方案都能帮你避免新增方法时因疏忽忘加ignore导致的不必要数据库查询,推荐根据实际场景选择:如果大部分字段都需要手动映射,选方案1;如果只是个别字段需要默认忽略,选方案2更灵活。
内容的提问来源于stack exchange,提问作者Matexon
相关产品推荐
相关产品推荐

