MapStruct 忽略 source 中的空值属性

  1. 1. 更新现有对象
  2. 2. 忽略 source 的空值
  3. 3. 参考

Bean 属性映射中如何满足以下场景:

  1. 给定一个有数据的 Bean 对象,该对象的数据可能从 DB 或其它什么地方获取而来
  2. 从前端传递一个 DTO 对象过来,将该对象的内容更新到 bean 中
  3. 忽略 DTO 中的空属性(NULL)

更新现有对象

一般的使用方法都是入参是旧对象,返回值是新对象。MapStruct 在调用的时候会使用构造方法创建一个全新的对象。 因此,要想实现更新给定对象的功能需要使用 @MappingTarget 注解。

以下代码,MapStruct 会生成基于 bean 的映射代码,不会重新创建对象。

1
void update(DTO dto, @MappingTarget Bean bean);

忽略 source 的空值

默认情况下,MapStruct 的映射都是直接把来源的属性全都 set 到目标对象上的。一般情况都是直接 new 的对象,所以原来也没什么值。

如果要改变这个行为,我们可以修改 @Mapping@BeanMapping@Mapper@MappingConfignullValuePropertyMappingStrategy 来配置。

该配置只对 @MappingTarget 注解的目标对象有效

1
2
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(DTO dto, @MappingTarget Bean bean);

这样的话,dto 中的空值就会被忽略,不会覆盖 bean 中已经存在的值。

参考

  1. [MapStruct 文档]: https://mapstruct.org/documentation/stable/reference/html/#mapping-result-for-null-properties
  2. [MapStruct - How to set different null strategy for different mapping methods?]: https://stackoverflow.com/questions/54174437/mapstruct-how-to-set-different-null-strategy-for-different-mapping-methods