忽略子对象,除了专门映射的属性

Ignore child object except specifically-mapped properties

有没有办法配置 MapStruct 映射以忽略子对象,但仍将特定 属性 映射到子对象上?

例如:

@Mapper
interface PersonMapper {
    @Mapping(target = "organization", ignore = true) // ignore organization
    @Mapping(source = "organizationId", target = "organization.id") // except organization.id
    Person toEntity(PersonModel model);
}

这样,目标 organization 是非空的,并且具有从源的 organizationId 字段设置的 id 字段。目前,这种方法似乎优先考虑被忽略的子 organization 而 属性 被保留为 null.

注意:我希望在不必实现自定义映射方法(例如,仅使用注释)的情况下执行此操作。

目前,如果不添加带有注释的额外映射方法,则无法实现您正在寻找的内容。

什么时候

@Mapping(target = "organization", ignore = true)
然后使用

,无论您对 organization 的嵌套映射做什么,整个 属性 organization 都会被忽略。

但是,如果您执行以下操作,您可以获得所需的内容:

@Mapper
interface PersonMapper {
    @Mapping(target = "organization", source = "model"
    Person toEntity(PersonModel model);

    @BeanMaping(ignoreByDefault = true)
    @Mapping(target = "id", source = "organizationId")
    Organization toOrganizationEntity(PersonModel model)
}

我们刚才做了什么:

  1. 我们添加了一个自定义 toOrganizationEntity 模型,从 PersonModelOrganization
  2. 我们说过我们正在将模型的源参数(从 toEntity)映射到组织中
  3. 我们将忽略 toOrganizationEntity
  4. 中目标映射的所有属性
  5. 我们明确地将 organizationId 映射到 Organizationid

如果您不想在 PersonMapper 接口上公开 public 方法,您可以改用抽象 class。

@Mapper
public class PersonMapper {
    @Mapping(target = "organization", source = "model"
    public abstract Person toEntity(PersonModel model);

    @BeanMaping(ignoreByDefault = true)
    @Mapping(target = "id", source = "organizationId")
    protected abstract Organization toOrganizationEntity(PersonModel model)
}