Nested object not getting mapped in MapStruct

Viewed 50

I am trying to set attributes of InvoiceDocument which contains one userDefined class EventPayload. The primitive type of objects in EventPayload are getting mapped but inside that one more class is there OrderInvoice which is setting as null. I have created a different mapper to set that but not sure how to link them. In source object OrderInvoice is a list but in Target it is an object.

@BeanMapping(ignoreByDefault = true)
@Mapping(target = "eventPayload", source = "baseRequest.invoice.eventPayload")
InvoiceDocument createInvoiceDocument(PaymentTriggerBaseModel baseRequest);

@Mapping(target = "orderInvoice", source ="baseRequest.invoice.eventPayload.orderInvoices", qualifiedByName="firstElement")
OrderInvoice createEventPayload(PaymentTriggerBaseModel baseRequest);

@Named("firstElement")
default OrderInvoice map(List<com.sams.oms.ng.common.models.payment.request.OrderInvoice> value) {
    if(value == null) return null;
    if(value.isEmpty()) return null;
    return mapInvoice(value.get(0));
}

abstract com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice mapInvoice(com.sams.oms.ng.common.models.payment.request.OrderInvoice invoice); 

POJO classes

public class InvoiceDocument {
private EventPayload eventPayload;
}

public class EventPayload{
private String customerId;
private String enterpriseCode;
private OrderInvoice orderInvoice;
}

public class OrderInvoice {
private String invoiceNo;
private String invoiceType;
}

Error

 java: Unmapped target property: "orderInvoice". Mapping from property "Order baseRequest.invoice.eventPayload" to "EventPayload eventPayload".
1 Answers

I have resolved it using below method.Mapping individual elements.

@Mapping(target = "eventPayload.documentType", source = "baseRequest.invoice.eventPayload.documentType")
@Mapping(target = "eventPayload.enterpriseCode", source = "baseRequest.invoice.eventPayload.enterpriseCode")
@Mapping(target = "eventPayload.orderInvoice", source = "baseRequest.invoice.eventPayload",qualifiedByName="firstElement")

@Named("firstElement")
default OrderInvoice map(Order value) {
    if(value == null) return null;
    return mapInvoice(value.getOrderInvoices().get(0));
}
Related