Используйте маппер для базового класса, чтобы отобразить дочерний класс - PullRequest
0 голосов
/ 22 октября 2018

У меня есть следующая структура класса

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 голосов
/ 23 октября 2018

MapStruct имеет механизм наследования конфигураций .В вашем случае я бы определил конфигурацию общего сопоставления (аннотированную @MapperConfig) вместо наследования мапперов и включил эту общую конфигурацию в ваш @Mapping.Эта общая конфигурация может затем использоваться @MapFromChild и @MapFromBase.Таким образом, вы используете композицию вместо наследования.

Общая конфигурация также может наследоваться @MapToBase и @MapToChild.

Если вы используете 1.3Beta , есть новые опции для автоматического наследования всехопции в маппере (и обратные)

0 голосов
/ 22 октября 2018

Вы должны связать 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 может быть интерфейсом.

...