基于类型的 MapStruct 映射器

MapStruct mapper based on type

考虑以下简化结构(每个结构都有一个 DO 和一个 DTO):

Component {
   UUID id;
   String name;
}

MotherboardComponent extends Component {
    String type;
    List<Component> components;
}

对于这两者,我都有一个映射器在 DO 和 DTO 之间进行映射,但是,我遇到了一个问题,我真的不知道如何处理它。如果对于列表中的 MotherboardComponent 我有另一个 MotherboardComponent,生成的映射对象是 ComponentDO 而不是 MotherboardComponentDO.

如果对象实际上是扩展对象而不是基础对象,我如何告诉 MapStruct 使用 MotherboardComponentMapper 内部的 MotherboardComponentMapper

谢谢

MapStruct 在运行时不执行任何操作。它曾经在编译时知道类型。

为了解决这个问题,您将不得不帮助它:

例如

@Mapper
public abstract class MotherboardComponentMapper {

    public abstract MotherboardComponentDO map(MotherboardComponent component);

    public ComponentDO map(Component component) {
        if (component instanceof MotherboardComponent) {
            return map((MotherboardComponent) component);
        }

        return mapAsComponentDO(component);
    }

    @Named("asComponentDO")
    protected abstract ComponentDO mapAsComponentDO(Component component);

}

由于我们用 @Named 标记了 mapAsComponentDO MapStruct 将不会处理它是从 Component 映射到 ComponentDO 的可能方法,它将使用 map(Component) 方法。

在 MapStruct 问题跟踪器中存在支持此类 down cast mapping 的未决问题。