web-dev-qa-db-ja.com

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
}
_

そして....

_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で処理できると思います。

3
Bevor

バージョン1.1.0.Finalを使用していると思います。追加のマッピングは正しいです。唯一の違いは、リストなしでマッピングを定義する必要があることです。その後、MapStructはそれを使用してマッピングを実行します(メッセージの例はコレクションに対して少し誤解を招く可能性があります)。

PaymentPlan paymentToPaymentPlan(Payment payment);

@Mappingsは自動的にマッピングされるため、必要ありません。 Instalmentのメソッドを定義する必要がある場合もあります(パッケージが異なるため)。

1.2.0.CR2に切り替えると、MapStructがメソッドを自動的に生成します。

3
Filip