[英]MapStruct - Map list of objects in single object
我從第 3 方獲取對象列表,但它始終只包含一個 object。 所以在我的目標結束時,我將它創建為 object 而不是列表。 object 包含多個列表,就像源 object 一樣。
這就是我嘗試將 map 列表添加到 object 的方式。 ChargeTransaction 包含 orderInvoice 作為 object 而不是列表。 對於 ChargeTransaction 內部的列表,我創建了單獨的映射器。 我不想在@afterMapping 中編寫 java 代碼,因為這樣嵌套列表將被映射。 嵌套列表在兩個對象中都是類型。
@Mapping(target = "orderInvoice", source = "basePaymentRequest.invoice.eventPayload.orderInvoices")
ChargeTransaction createInvoiceCTMapper(PaymentTriggerBaseModel basePaymentRequest, ChargeType chargeType);
錯誤
java: Can't map property "List<OrderInvoice> basePaymentRequest.invoice.eventPayload.orderInvoices" to "OrderInvoice orderInvoice". Consider to declare/implement a mapping method: "OrderInvoice map(List<OrderInvoice> value)".
我試過了
@Mapping(target = "orderInvoice", expression= "java(basePaymentRequest.invoice.eventPayload.orderInvoices.get(0))")
但它在 Impl class 中給出錯誤
chargeTransaction.setOrderInvoice( basePaymentRequest.invoice.eventPayload.orderInvoices.get(0) );
java: incompatible types: com.sams.oms.ng.common.models.payment.request.OrderInvoice cannot be converted to com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice
恕我直言,解決此問題的最佳方法是使用@Named
與@Mapping#qualifiedByName
配對
@Mapper
class Mapper {
@Mapping(target = "orderInvoice", source ="basePaymentRequest.invoice.eventPayload.orderInvoices", qualifiedByName="firstElement")
ChargeTransaction createInvoiceCTMapper(PaymentTriggerBaseModel basePaymentRequest, ChargeType chargeType);
@Named("firstElement")
OrderInvoice map(List<OrderInvoice> value) {
if(value == null) return null;
if(value.isEmpty()) return null;
return map(value.get(0));
}
abstract com.sams.oms.ng.common.models.payment.request.OrderInvoice map(com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice invoice);
}
通過這種方式,您被指示 MapStruct 使用map(List<>)
將發票轉換為單個 OrderInvoice 和抽象map(OrderInvoice)
以讓 MapStruct 自動生成映射代碼。
代碼未經測試,因為我今天沒有限制空閑時間,但我希望我的示例可能有用;如果有任何錯誤,請隨時發表評論,我會盡快更正代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.