diff --git a/mapstruct-3/src/main/java/com/baeldung/dto/AncestorDto.java b/mapstruct-3/src/main/java/com/baeldung/dto/AncestorDto.java new file mode 100644 index 000000000000..48b489faa08d --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/dto/AncestorDto.java @@ -0,0 +1,43 @@ +package com.baeldung.dto; + +public class AncestorDto { + + private String firstName; + + private Double weight; + + private String vatNumber; + + public AncestorDto() { + } + + public AncestorDto(String firstName, Double weight, String vatNumber) { + this.firstName = firstName; + this.weight = weight; + this.vatNumber = vatNumber; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public String getVatNumber() { + return vatNumber; + } + + public void setVatNumber(String vatNumber) { + this.vatNumber = vatNumber; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/dto/OrderDto.java b/mapstruct-3/src/main/java/com/baeldung/dto/OrderDto.java new file mode 100644 index 000000000000..4b5277aa78bd --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/dto/OrderDto.java @@ -0,0 +1,45 @@ +package com.baeldung.dto; + +import java.util.List; + +public class OrderDto { + + private String transactionId; + + private List orderItemIds; + + private PaymentDto paymentDto; + + public OrderDto(String transactionId, List orderItemIds, PaymentDto paymentDto) { + this.transactionId = transactionId; + this.orderItemIds = orderItemIds; + this.paymentDto = paymentDto; + } + + public OrderDto() { + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public List getOrderItemIds() { + return orderItemIds; + } + + public void setOrderItemIds(List orderItemIds) { + this.orderItemIds = orderItemIds; + } + + public PaymentDto getPaymentDto() { + return paymentDto; + } + + public void setPaymentDto(PaymentDto paymentDto) { + this.paymentDto = paymentDto; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/dto/PaymentDto.java b/mapstruct-3/src/main/java/com/baeldung/dto/PaymentDto.java new file mode 100644 index 000000000000..94768c008ab7 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/dto/PaymentDto.java @@ -0,0 +1,21 @@ +package com.baeldung.dto; + +public class PaymentDto { + + private String type; + + public PaymentDto() { + } + + public PaymentDto(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/entity/GrandDad.java b/mapstruct-3/src/main/java/com/baeldung/entity/GrandDad.java new file mode 100644 index 000000000000..6b9fabae0d1b --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/entity/GrandDad.java @@ -0,0 +1,43 @@ +package com.baeldung.entity; + +public class GrandDad { + + private Identity identity; + + private String weight; + + private String vatNumber; + + public GrandDad() { + } + + public GrandDad(Identity identity, String weight, String vatNumber) { + this.identity = identity; + this.weight = weight; + this.vatNumber = vatNumber; + } + + public Identity getIdentity() { + return identity; + } + + public void setIdentity(Identity identity) { + this.identity = identity; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getVatNumber() { + return vatNumber; + } + + public void setVatNumber(String vatNumber) { + this.vatNumber = vatNumber; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/entity/Identity.java b/mapstruct-3/src/main/java/com/baeldung/entity/Identity.java new file mode 100644 index 000000000000..814cd7b472e2 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/entity/Identity.java @@ -0,0 +1,32 @@ +package com.baeldung.entity; + +public class Identity { + + private String name; + private String surname; + + public Identity() { + } + + public Identity(String name, String surname) { + this.name = name; + this.surname = surname; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + +} diff --git a/mapstruct-3/src/main/java/com/baeldung/entity/Order.java b/mapstruct-3/src/main/java/com/baeldung/entity/Order.java new file mode 100644 index 000000000000..f757e5a8b11c --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/entity/Order.java @@ -0,0 +1,45 @@ +package com.baeldung.entity; + +import java.util.List; + +public class Order { + + private String transactionId; + + private List orderItemIds; + + private Payment payment; + + public Order(String transactionId, List orderItemIds, Payment payment) { + this.transactionId = transactionId; + this.orderItemIds = orderItemIds; + this.payment = payment; + } + + public Order() { + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public List getOrderItemIds() { + return orderItemIds; + } + + public void setOrderItemIds(List orderItemIds) { + this.orderItemIds = orderItemIds; + } + + public Payment getPayment() { + return payment; + } + + public void setPayment(Payment payment) { + this.payment = payment; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/entity/Payment.java b/mapstruct-3/src/main/java/com/baeldung/entity/Payment.java new file mode 100644 index 000000000000..426f2f4991ec --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/entity/Payment.java @@ -0,0 +1,21 @@ +package com.baeldung.entity; + +public class Payment { + + private String type; + + public Payment() { + } + + public Payment(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/mapstruct-3/src/main/java/com/baeldung/mapper/AncestorMapper.java b/mapstruct-3/src/main/java/com/baeldung/mapper/AncestorMapper.java new file mode 100644 index 000000000000..5236a7c7f560 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mapper/AncestorMapper.java @@ -0,0 +1,15 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.AncestorDto; +import com.baeldung.entity.GrandDad; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper +public interface AncestorMapper { + + @Mapping(source = "identity.name", target = "firstName") + @Mapping(source = "weight", target = "weight", numberFormat = "###.#") + AncestorDto toDto(GrandDad grandDad); + +} diff --git a/mapstruct-3/src/main/java/com/baeldung/mapper/MediaMapper.java b/mapstruct-3/src/main/java/com/baeldung/mapper/MediaMapper.java index 2629a1820a3e..e240b121e8d3 100644 --- a/mapstruct-3/src/main/java/com/baeldung/mapper/MediaMapper.java +++ b/mapstruct-3/src/main/java/com/baeldung/mapper/MediaMapper.java @@ -1,9 +1,8 @@ package com.baeldung.mapper; -import org.mapstruct.Mapper; - import com.baeldung.dto.MediaDto; import com.baeldung.entity.Media; +import org.mapstruct.Mapper; @Mapper public interface MediaMapper { diff --git a/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithAfterMapping.java b/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithAfterMapping.java new file mode 100644 index 000000000000..efc4749ee90b --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithAfterMapping.java @@ -0,0 +1,29 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.OrderDto; +import com.baeldung.entity.Order; +import org.mapstruct.AfterMapping; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; + +import java.util.ArrayList; + +@Mapper(uses = PaymentMapper.class) +public interface OrderMapperWithAfterMapping { + + @Mapping(source = "payment", target = "paymentDto") + OrderDto toDto(Order order); + + @AfterMapping + default OrderDto postProcessing(@MappingTarget OrderDto orderDto) { + if (orderDto.getOrderItemIds() == null) { + orderDto.setOrderItemIds(new ArrayList<>()); + } + if (orderDto.getTransactionId() == null) { + orderDto.setTransactionId("N/A"); + } + return orderDto; + } + +} diff --git a/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithDefault.java b/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithDefault.java new file mode 100644 index 000000000000..0c1ffa7cf394 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mapper/OrderMapperWithDefault.java @@ -0,0 +1,23 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.OrderDto; +import com.baeldung.entity.Order; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(uses = PaymentMapper.class) +public interface OrderMapperWithDefault { + + @Mapping( + source = "payment", + target = "paymentDto", + defaultExpression = "java(new com.baeldung.dto.PaymentDto())" + ) + @Mapping( + source = "transactionId", + target = "transactionId", + defaultValue = "N/A" + ) + OrderDto toDto(Order order); + +} diff --git a/mapstruct-3/src/main/java/com/baeldung/mapper/PaymentMapper.java b/mapstruct-3/src/main/java/com/baeldung/mapper/PaymentMapper.java new file mode 100644 index 000000000000..3fe1d8d9f321 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mapper/PaymentMapper.java @@ -0,0 +1,12 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.PaymentDto; +import com.baeldung.entity.Payment; +import org.mapstruct.Mapper; + +@Mapper +public interface PaymentMapper { + + PaymentDto toDto(Payment payment); + +} diff --git a/mapstruct-3/src/test/java/com/baeldung/mapper/AncestorMapperUnitTest.java b/mapstruct-3/src/test/java/com/baeldung/mapper/AncestorMapperUnitTest.java new file mode 100644 index 000000000000..c6163c286a73 --- /dev/null +++ b/mapstruct-3/src/test/java/com/baeldung/mapper/AncestorMapperUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.AncestorDto; +import com.baeldung.entity.GrandDad; +import com.baeldung.entity.Identity; +import org.junit.Test; +import org.mapstruct.factory.Mappers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class AncestorMapperUnitTest { + + @Test + public void whenAncestorMapperToDtoMapsGrandad_thenSourceValuesAreUsed() { + AncestorMapper mapper = Mappers.getMapper(AncestorMapper.class); + GrandDad source = new GrandDad( + new Identity("Thomas", "Tom"), + "80.00", + "1234556" + ); + AncestorDto mapped = mapper.toDto(source); + assertEquals("Thomas", mapped.getFirstName()); + assertEquals(80.0d, mapped.getWeight(), 0.01d); + assertEquals("1234556", mapped.getVatNumber()); + } + + @Test + public void whenAncestorMapperToDtoMapsGrandadWithEmptyValues_thenNullValuesAreMapped() { + AncestorMapper mapper = Mappers.getMapper(AncestorMapper.class); + GrandDad source = new GrandDad( + null, + null, + "1234556" + ); + AncestorDto mapped = mapper.toDto(source); + assertNull(mapped.getFirstName()); + assertNull(mapped.getWeight()); + assertEquals("1234556", mapped.getVatNumber()); + } + +} diff --git a/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithAfterMappingUnitTest.java b/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithAfterMappingUnitTest.java new file mode 100644 index 000000000000..e6d6d91fbf9c --- /dev/null +++ b/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithAfterMappingUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.mapper; + + +import com.baeldung.dto.OrderDto; +import com.baeldung.entity.Order; +import com.baeldung.entity.Payment; +import org.junit.Test; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class OrderMapperWithAfterMappingUnitTest { + + @Test + public void whenOrderMapperWithAfterMappingToDtoMapsOrderWithEmptyProperties_thenDefaultValuesAreUsed() { + OrderMapperWithAfterMapping mapper = Mappers.getMapper(OrderMapperWithAfterMapping.class); + Order orderSource = new Order(); + orderSource.setPayment(new Payment("Cash")); + OrderDto mapped = mapper.toDto(orderSource); + assertEquals("Cash", mapped.getPaymentDto().getType()); + assertEquals("N/A", mapped.getTransactionId()); + assertNotNull(mapped.getOrderItemIds()); + assertEquals(0, mapped.getOrderItemIds().size()); + } + + @Test + public void whenOrderMapperWithAfterMappingToDtoMapsOrderWithNonEmptyProperties_thenSourceValuesAreUsed() { + OrderMapperWithAfterMapping mapper = Mappers.getMapper(OrderMapperWithAfterMapping.class); + Order orderSource = new Order(); + orderSource.setPayment(new Payment("Cash")); + orderSource.setOrderItemIds(List.of("item1", "item2")); + orderSource.setTransactionId("orderTransaction"); + OrderDto mapped = mapper.toDto(orderSource); + assertEquals("Cash", mapped.getPaymentDto().getType()); + assertEquals("orderTransaction", mapped.getTransactionId()); + assertNotNull(mapped.getOrderItemIds()); + assertEquals(2, mapped.getOrderItemIds().size()); + } + +} diff --git a/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithDefaultUnitTest.java b/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithDefaultUnitTest.java new file mode 100644 index 000000000000..9f8824213411 --- /dev/null +++ b/mapstruct-3/src/test/java/com/baeldung/mapper/OrderMapperWithDefaultUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.OrderDto; +import com.baeldung.entity.Order; +import com.baeldung.entity.Payment; +import org.junit.Test; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +import static org.junit.Assert.*; + +public class OrderMapperWithDefaultUnitTest { + + @Test + public void whenOrderMapperWithDefaultToDtoMapsOrderWithEmptyProperties_thenDefaultValuesAreUsed() { + OrderMapperWithDefault mapper = Mappers.getMapper(OrderMapperWithDefault.class); + Order orderSource = new Order(); + orderSource.setPayment(new Payment("Cash")); + OrderDto mapped = mapper.toDto(orderSource); + assertEquals("Cash", mapped.getPaymentDto().getType()); + assertEquals("N/A", mapped.getTransactionId()); + assertNull(mapped.getOrderItemIds()); + } + + @Test + public void whenOrderMapperWithDefaultToDtoMapsOrderWithNonEmptyProperties_thenSourceValuesAreUsed() { + OrderMapperWithDefault mapper = Mappers.getMapper(OrderMapperWithDefault.class); + Order orderSource = new Order(); + orderSource.setPayment(new Payment("Cash")); + orderSource.setOrderItemIds(List.of("item1", "item2")); + orderSource.setTransactionId("orderTransaction"); + OrderDto mapped = mapper.toDto(orderSource); + assertEquals("Cash", mapped.getPaymentDto().getType()); + assertEquals("orderTransaction", mapped.getTransactionId()); + assertNotNull(mapped.getOrderItemIds()); + assertEquals(2, mapped.getOrderItemIds().size()); + } + +}