mapStruct:将列表映射到其他列表?

Bev*_*vor 7 mapstruct

我有一个列表List<Payment>,我想将其映射到另一个列表List<PaymentPlan>。这些类型如下所示:

public class Payment {

    @XmlElement(name = "Installment")
    @JsonProperty("Installment")
    private List<Installment> installments = new ArrayList<>();

    @XmlElement(name = "OriginalAmount")
    @JsonProperty("OriginalAmount")
    private BigDecimal originalAmount;

//getters setters, more attributes
}
Run Code Online (Sandbox Code Playgroud)

和....

public class PaymentPlan {
    //(Installment in different package)
    private List<Installment> installments;

    @XmlElement(name = "OriginalAmount")
    @JsonProperty("OriginalAmount")
    private BigDecimal originalAmount;

//getters setters, more attributes
}
Run Code Online (Sandbox Code Playgroud)

我希望这样的事情正在起作用......

@Mappings({
    @Mapping(//other mappings...),
    @Mapping(source = "payments", target = "paymentInformation.paymentPlans")
})
ResultResponse originalResponseToResultResponse(OrigResponse originalResponse);
Run Code Online (Sandbox Code Playgroud)

...但我得到:

Can't map property java.util.List<Payment> to java.util.List<PaymentPlan>.
Consider to declare/implement a mapping method java.util.List<PaymentPlan> map(java.util.List<Payment> value);
Run Code Online (Sandbox Code Playgroud)

我不知道如何应用这些信息。首先,我需要为列表声明一些额外的映射(在同一个映射器类中),因此 MapStruct 知道如何映射 List 类型的每个字段,如下所示:

@Mappings({
  @Mapping(source = "payment.originalAmount", target = "paymentInformation.paymentPlan.originalAmount")
})
List<PaymentPlan> paymentToPaymentPlan(List<Payment> payment);
Run Code Online (Sandbox Code Playgroud)

...但我收到错误消息,例如

The type of parameter "payment" has no property named "originalAmount".
Run Code Online (Sandbox Code Playgroud)

显然我做了一些完全错误的事情,因为听起来它甚至无法识别 List 的类型。

我怎样才能基本上从一个列表映射到另一个类似的列表?显然我需要结合不同的映射策略。

顺便说一句:我知道如何使用表达式映射来做到这一点,比如......

@Mapping(target = "paymentPlans",expression="java(Helper.mapManually(payments))")

但我猜 MapStruct 可以自己处理这个。

Fil*_*lip 5

我想你正在使用 version 1.1.0.Final。您的额外映射是正确的,唯一的区别是您需要定义一个没有列表的映射,然后 MapStruct 将使用它来进行映射(示例消息对集合有点误导)。

PaymentPlan paymentToPaymentPlan(Payment payment);
Run Code Online (Sandbox Code Playgroud)

您甚至不需要@Mappings它们,因为它们会自动映射。您可能还需要为Instalment(因为它们在不同的包中)定义方法。

如果您切换到 1.2.0.CR2,那么 MapStruct 可以自动为您生成方法。

  • 我第一次读到这篇文章时不明白你的回答。我不明白您的意思是除了*列表映射之外还添加非列表映射。为了清楚起见,您可以考虑在此处添加完整 @Mapper 文件的示例。 (2认同)