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

Java 使用基类的映射器映射子类,java,mapstruct,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); MapTo

我的班级结构如下

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
映射器,而不必手动复制所有映射?

您必须将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);
}
类子类型{
}
类Child扩展了ChildType{
}
类超级孩子扩展了ChildType{
}
类OtherChild扩展了ChildType{
}
类MapFromBase{
}
类MapFromChild扩展了MapFromBase{
}
MapToBase类{
}
类MapToChild扩展了MapToBase{
}
@制图员
接口映射器{
MapToBase universalMap(MapFromBase值);
}

ChildType也可以是一个接口。

MapStruct有一种机制来实现。在您的情况下,我将定义一个共享映射配置(带注释的
@MapperConfig
),而不是映射程序的继承,并将此共享配置包含在您的
@mapping
中。然后,
@MapFromChild
@MapFromBase
可以使用此共享配置。通过这种方式,您可以使用组合而不是继承

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


如果使用,则会有新选项自动继承映射器中的所有选项(以及相反的选项)

创建一个方法并覆盖/调用父级?仅代码的答案通常不是很好;也许考虑增加一个解释。