我从第三方得到了一个对象列表,但是它总是只包含一个对象。因此,在目标的末尾,我将它创建为一个对象,而不是列表。该对象中包含多个列表,就像源对象一样。
这就是我试图将列表映射到对象的方式。ChargeTransaction包含orderInvoice作为对象,而不是列表。对于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类的错误。
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
发布于 2022-09-13 03:52:30
解决这个问题的最好方法是使用@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自动生成映射代码。
代码没有经过测试,因为我今天没有限制空闲时间,但我希望我的示例可能有用;如果有任何错误,请随意评论,我会尽快更正代码。
https://stackoverflow.com/questions/73701094
复制