【问题标题】:Ignore child object except specifically-mapped properties忽略子对象,特别映射的属性除外
【发布时间】:2020-01-20 15:43:48
【问题描述】:

有没有办法配置 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

注意:我希望这样做而不必实现自定义映射方法(例如,仅使用注释)。

【问题讨论】:

  • 你不能在同一级别上忽略(所以组织的子属性)..
  • 另一种选择是添加 @BeanMapping 注释,并带有选项 ignore all = true。

标签: java mapstruct


【解决方案1】:

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

什么时候

@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. 我们正在将organizationId 显式映射到Organizationid

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

@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)
}

【讨论】:

  • 谢谢,我试试看。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2017-12-31
  • 2016-08-15
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多