Как я могу сопоставить источники с одним и тем же объектом в ModelMapper

Как я могу выразить следующее в ModelMapper: чтобы заполнить поле в цели, я хочу использовать свойство A источника, если оно не равно нулю, в противном случае используйте свойство B.

Пример (код ниже, если вам не нравятся технические описания): допустим, я хочу перейти от исходного класса SourceBigThing к целевому классу Target с помощью ModelMapper. SourceBigThing имеет два свойства: одно называется red, а другое — green. Эти два свойства относятся к разным типам RedSmallThing и GreenSmallThing. Обе эти вещи имеют свойство под названием name. SourceBigThing может иметь либо красный, либо зеленый цвет, но не оба (другой - нуль). Я хочу сопоставить имена мелких вещей со свойством целевого класса.

Пример кода:

class SourceBigThing {
    private final SourceSmallThingGreen green;
    private final SourceSmallThingRed red;
}

class SourceSmallThingGreen {
    private final String name;
}

class SourceSmallThingRed {
    private final String name;
}



class Target {
    private TargetColorThing thing;
}

class TargetColorThing {
    // This property should either be "green.name" or "red.name" depending
    // on if red or green are !=null
    private String name; 
}

Я пытался поиграться с условными выражениями, но у вас не может быть двух сопоставлений с одной и той же целью, потому что ModelMapper выдает исключение для повторяющихся сопоставлений:

when(Conditions.isNotNull()).map(source.getGreen()).setThing(null);
when(Conditions.isNotNull()).map(source.getRed()).setThing(null);

Вы можете найти неудачный TestNG-Unit-Test в этой сути .


person theomega    schedule 10.09.2014    source источник


Ответы (1)


Это немного необычный случай, поэтому нет никакого аккуратного способа сделать это. Но вы всегда можете использовать конвертер - что-то вроде:

using(new Converter<SourceBigThing, TargetColorThing>(){
  public TargetColorThing convert(MappingContext<SourceBigThing, TargetColorThing> context) {
    TargetColorThing target = new TargetColorThing();
    if (context.getSource().getGreen() != null)
      target.setName(context.getSource().getGreen().getName());
    else if (context.getSource().getRed() != null)
      target.setName(context.getSource().getRed().getName());
    return target;
}}).map(source).setThing(null);
person Jonathan    schedule 10.09.2014