如何在ModelMapper中从源映射到同一对象

时间:2014-09-10 13:06:59

标签: java modelmapper

如何在ModelMapper中表达以下内容:要填充目标中的字段,我想使用源的属性A(如果它是非null),否则使用属性B.

示例(如果您不喜欢技术说明,请参阅下面的代码): 假设我想使用ModelMapper从源类SourceBigThing到目标类TargetSourceBigThing有两个属性,一个名为red,另一个名为green。这两个属性的类型不同RedSmallThingGreenSmallThing。这两件事都有一个名为name的属性。 SourceBigThing可以是红色或绿色,但不能同时为两个(另一个为空)。我想将Small Things的名称映射到目标类的属性。

实施例-代码:

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);

您可以在this gist找到失败的TestNG-Unit-Test。

1 个答案:

答案 0 :(得分: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);