如何在ModelMapper中表达以下内容:要填充目标中的字段,我想使用源的属性A(如果它是非null),否则使用属性B.
示例(如果您不喜欢技术说明,请参阅下面的代码):
假设我想使用ModelMapper从源类SourceBigThing
到目标类Target
。 SourceBigThing
有两个属性,一个名为red
,另一个名为green
。这两个属性的类型不同RedSmallThing
和GreenSmallThing
。这两件事都有一个名为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。
答案 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);