首页 > 解决方案 > 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

标签: javamapstruct

解决方案


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 负责生成映射器。注意:您仍然可以使用 a MyComplexTargetObjectMapperto do single source to target 来实现这一点。


推荐阅读