2017-09-18 91 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