使用基类的映射器来映射子类

时间:2018-10-22 12:12:40

标签: java mapstruct

我具有以下课程结构

class MapFromBase {
}

class MapFromChild extends MapFromBase {
}

class MapToBase {
}

class MapToChild extends MapToBase {
}

@Mapper
interface Mapper {
  @Mappings(/* a lot of mappings */)
  MapToBase mapBase (MapFromBase value);

  MapToChild mapChild (MapFromChild value);
}

是否有一种方法可以使mapChild映射器对从基类继承的所有字段都使用mapBase映射器,而无需手动复制所有映射?

2 个答案:

答案 0 :(得分:2)

MapStruct具有inherit configurations的机制。在您的情况下,我将定义一个共享映射配置(注释为@MapperConfig来代替映射器的继承,并将此共享配置包括在您的@Mapping中。然后,@MapFromChild@MapFromBase可以使用此共享配置。这样,您可以使用合成代替继承。

@MapToBase@MapToChild也可以反向继承共享配置。

如果您使用1.3Beta,则有一些新选项可以自动继承映射器中的所有选项(以及相反的选项)

答案 1 :(得分:0)

您必须链接MapFromChild和MapToChild。您可以使用通用标记。

class ChildType {        
}
class Child extends ChildType {
}
class SuperChild extends ChildType {
}
class OtherChild extends ChildType {
}

class MapFromBase<T extends ChildType> {
}

class MapFromChild extends MapFromBase<Child> {
}

class MapToBase<T extends ChildType> {
}

class MapToChild extends MapToBase<Child>  {
}

@Mapper
interface Mapper <X extends ChildType> {
    MapToBase<X> universalMap (MapFromBase<X> value);
}

ChildType也可以是接口。