MapStruct多源对象映射空属性设置默认值策略不生效问题
问题核心原因
NullValuePropertyMappingStrategy 仅作用于带@MappingTarget参数的更新型映射方法(即对已有对象做属性覆盖的场景),你当前使用的是返回新实例的构造型映射,该策略默认不生效,属于设计如此。
可行解决方案
方案1:单属性指定默认值(灵活可控)
直接在@Mapping注解中通过defaultValue指定对应属性为空时的默认值,多源映射时需明确指定属性所属的源参数:
@Mapper(componentModel = "spring") public interface OperationDataMapper { @Mapping(target = "prop1", source = "o1.prop1", defaultValue = "") @Mapping(target = "prop2", source = "o2.prop2", defaultValue = "") // 其余属性按相同规则配置 OperationDTO from(Object1 o1, Object2 o2); }
该方式生成的代码会自动包含空值判断和默认值赋值逻辑,完全符合你预期的代码结构。
方案2:全局同类型默认值处理(适合统一规则场景)
如果某一类类型的默认值规则统一(比如所有String类型空值都转空串,Integer类型空值转0),可以在Mapper接口中定义通用类型转换方法,MapStruct会自动匹配类型调用:
@Mapper(componentModel = "spring") public interface OperationDataMapper { OperationDTO from(Object1 o1, Object2 o2); // 所有String类型属性映射时自动调用该方法做转换 default String nullToEmpty(String value) { return value == null ? "" : value; } // 可按需添加其他类型的空值处理方法 default Integer nullToZero(Integer value) { return value == null ? 0 : value; } }
方案3:全局后置统一处理(适合属性多、规则统一场景)
使用@AfterMapping注解定义映射后置处理方法,所有属性映射完成后自动调用该方法统一做空值补默认值逻辑:
@Mapper(componentModel = "spring") public interface OperationDataMapper { OperationDTO from(Object1 o1, Object2 o2); @AfterMapping default void fillDefaultValues(@MappingTarget OperationDTO dto) { if (dto.getProp1() == null) { dto.setProp1(""); } if (dto.getProp2() == null) { dto.setProp2(""); } // 其余属性统一处理 } }
内容的提问来源于stack exchange,提问作者fdev
相关产品推荐
相关产品推荐

