Mapstruct隐式调用具有多个参数的其他映射器

时间:2019-05-15 12:29:42

标签: java mapstruct

给出以下类和一个使用多个源参数的映射器

(我使用lombok来使源代码尽可能短。)

@Getter
@Setter
public class MySourceOne {
  private String src1;
}

@Getter
@Setter
public class MySourceTwo {
  private String src2;
}

@Getter
@Setter
public class MyTargetObject {
  private String prop1;
  private String prop2;
}

@Mapper
public interface MyTargetObjectMapper {
  @Mapping(target="prop1", source="a")
  @Mapping(target="prop2", source="b")
  public MyTargetObject mapMyObject(String a, String b);
}

@Getter
@Setter
public class MyComplexTargetObject {
  private MyTargetObject myTargetObject;
}

我正在尝试为MyComplexTargetObject创建一个映射器,该映射器将隐式调用MyTargetObjectMapper

但是“源”不允许映射多个参数

@Mapper(uses= {MyTargetObjectMapper.class})
public interface MyComplexTargetObjectMapper {
  @Mapping(target="myTargetObject", source="one.src1, two.src2")
  public MyComplexTargetObject convert(MySourceOne one, MySourceTwo two);
}

因此,我尝试使用expression="..."而不是源代码,但到目前为止没有任何效果。

有人想到一种干净的方法来做到这一点而无需使用具体方法调用MyTargetObjectMapper吗?

1 个答案:

答案 0 :(得分:1)

MapStruct不支持选择具有多个源的方法。

但是:您可以进行目标嵌套。

@Mapper
public interface MyComplexTargetObjectMapper {

    @Mapping(target="myTargetObject.prop1", source="one.src1" )
    @Mapping(target="myTargetObject.prop2", source="two.src2")
    public MyComplexTargetObject convert(MySourceOne one, MySourceTwo two);
}

让MapStruct负责生成映射器。注意:您仍然可以使用MyComplexTargetObjectMapper进行单一来源定位以实现此目标。