2

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

示例(如果您不喜欢技术描述,请使用下面的代码):假设我想使用 ModelMapper从源类SourceBigThing到目标类。有两个属性,一个是被调用Target的,一个是被调用的。这两个属性是不同的类型和。这两个东西都有一个叫做 的属性。A可以有红色或绿色,但不能两者都有(另一个为空)。我想将 Small Things 的名称映射到目标类的属性。SourceBigThingredgreenRedSmallThingGreenSmallThingnameSourceBigThing

示例代码:

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

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

4

1 回答 1

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);
于 2014-09-10T17:34:38.630 回答