2017-09-18 63 views
0

我有一个列表List<Payment>,我想映射到另一个列表List<PaymentPlan>。这些类型是这样的:mapStruct:地图列表到其他列表?

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 
} 

和....

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

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

//getters setters, more attributes 
} 

我希望这样的事情是工作...

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

...但我得到:

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

我不知道如何将其应用于形成。首先,我虽然我需要声明一些额外的映射(在相同的映射类)的名单,所以MapStruct知道如何像这样的列表类型的每个字段映射:

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

...但我得到的错误像

The type of parameter "payment" has no property named "originalAmount". 

显然我做了一些完全错误的,因为它听起来像它甚至不承认列表的类型。

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

顺便说一句:我知道如何与表情映射,像这样做...

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

,但我想MapStruct可以通过iself处理这个问题。

回答

2

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

PaymentPlan paymentToPaymentPlan(Payment payment); 

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

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

+0

我明白。它现在起作用,thx。 – Bevor