From f599416efec162a14a7d3cd884582d6f27665bc9 Mon Sep 17 00:00:00 2001 From: umara-123 Date: Sun, 2 Nov 2025 19:44:25 +0500 Subject: [PATCH 1/2] BAEL-9154 Mapping Abstract Classes in Mapstruct --- .../Mapper/PersonFactory.java | 13 ++++++ .../Mapper/PersonMapperFactory.java | 24 +++++++++++ .../Mapper/PersonMapperInlineFactory.java | 32 ++++++++++++++ .../mappingAbstractClass/dto/PersonDTO.java | 43 +++++++++++++++++++ .../mappingAbstractClass/entity/Customer.java | 19 ++++++++ .../mappingAbstractClass/entity/Employee.java | 20 +++++++++ .../mappingAbstractClass/entity/Person.java | 21 +++++++++ 7 files changed, 172 insertions(+) create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonFactory.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperFactory.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/dto/PersonDTO.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Customer.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Employee.java create mode 100644 mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Person.java diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonFactory.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonFactory.java new file mode 100644 index 000000000000..daa9126b85fb --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonFactory.java @@ -0,0 +1,13 @@ +package com.example.Mapper; + +import com.example.entity.Customer; +import com.example.entity.Employee; + +public class PersonFactory { + + public Employee createEmployee() { return new Employee(); } + public Customer createCustomer() { return new Customer(); } + } + + + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperFactory.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperFactory.java new file mode 100644 index 000000000000..3a6482c00ddb --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperFactory.java @@ -0,0 +1,24 @@ +package com.example.Mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import com.example.dto.PersonDTO; +import com.example.entity.Customer; +import com.example.entity.Employee; + +@Mapper(componentModel = "default", uses = PersonFactory.class) +public interface PersonMapperFactory { + PersonMapperFactory INSTANCE = Mappers.getMapper(PersonMapperFactory.class); + + @Mapping(target = "department", source = "department") + @Mapping(target = "salary", source = "salary") + Employee toEmployee(PersonDTO dto); + + @Mapping(target = "customerId", source = "customerId") + @Mapping(target = "tier", source = "tier") + Customer toCustomer(PersonDTO dto); +} + + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java new file mode 100644 index 000000000000..abee2a763e23 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java @@ -0,0 +1,32 @@ +package com.example.Mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ObjectFactory; +import org.mapstruct.factory.Mappers; + +import com.example.dto.PersonDTO; +import com.example.entity.Customer; +import com.example.entity.Employee; +import com.example.entity.Person; + +@Mapper +public interface PersonMapperInlineFactory { + PersonMapperInlineFactory INSTANCE = Mappers.getMapper(PersonMapperInlineFactory.class); + + @Mapping(target = "department") + @Mapping(target = "salary") + Employee toEmployee(PersonDTO dto); + + @Mapping(target = "customerId") + @Mapping(target = "tier") + Customer toCustomer(PersonDTO dto); + + @ObjectFactory + default Person createPerson(Class targetType, PersonDTO dto) { + if ("employee".equalsIgnoreCase(dto.getType())) return new Employee(); + else if ("customer".equalsIgnoreCase(dto.getType())) return new Customer(); + throw new IllegalArgumentException("Unknown type: " + dto.getType()); + } +} + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/dto/PersonDTO.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/dto/PersonDTO.java new file mode 100644 index 000000000000..53bb754ff778 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/dto/PersonDTO.java @@ -0,0 +1,43 @@ +package com.example.dto; + +public class PersonDTO { + private String name; + private int age; + + // Employee-specific + private String department; + private double salary; + + // Customer-specific + private String customerId; + private String tier; + + // Type to decide subclass: "employee" or "customer" + private String type; + + // Getters and Setters + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public int getAge() { return age; } + public void setAge(int age) { this.age = age; } + + public String getDepartment() { return department; } + public void setDepartment(String department) { this.department = department; } + + public double getSalary() { return salary; } + public void setSalary(double salary) { this.salary = salary; } + + public String getCustomerId() { return customerId; } + public void setCustomerId(String customerId) { this.customerId = customerId; } + + public String getTier() { return tier; } + public void setTier(String tier) { this.tier = tier; } + + public String getType() { return type; } + public void setType(String type) { this.type = type; } +} + + + + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Customer.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Customer.java new file mode 100644 index 000000000000..9e694863c1a1 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Customer.java @@ -0,0 +1,19 @@ +package com.example.entity; + +public class Customer extends Person { + private String customerId; + private String tier; + + public Customer() {} + public Customer(String name, int age, String customerId, String tier) { + super(name, age); + this.customerId = customerId; + this.tier = tier; + } + + public String getCustomerId() { return customerId; } + public void setCustomerId(String customerId) { this.customerId = customerId; } + public String getTier() { return tier; } + public void setTier(String tier) { this.tier = tier; } +} + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Employee.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Employee.java new file mode 100644 index 000000000000..2c79d033d9a1 --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Employee.java @@ -0,0 +1,20 @@ +package com.example.entity; + +public class Employee extends Person { + private String department; + private double salary; + + public Employee() {} + public Employee(String name, int age, String department, double salary) { + super(name, age); + this.department = department; + this.salary = salary; + } + + public String getDepartment() { return department; } + public void setDepartment(String department) { this.department = department; } + public double getSalary() { return salary; } + public void setSalary(double salary) { this.salary = salary; } +} + + diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Person.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Person.java new file mode 100644 index 000000000000..9a09707932ed --- /dev/null +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/entity/Person.java @@ -0,0 +1,21 @@ +package com.example.entity; + +public abstract class Person { + + private String name; + private int age; + + public Person() {} + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public int getAge() { return age; } + public void setAge(int age) { this.age = age; } + + +} From f91d6a4c2944c4657579e0a12c03d2f03782edb6 Mon Sep 17 00:00:00 2001 From: umara-123 Date: Mon, 3 Nov 2025 01:17:29 +0500 Subject: [PATCH 2/2] Mapping Abstract Classes in Mapstruct --- .../Mapper/PersonMapperInlineFactory.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java index abee2a763e23..8132aedcad0a 100644 --- a/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java +++ b/mapstruct-3/src/main/java/com/baeldung/mappingAbstractClass/Mapper/PersonMapperInlineFactory.java @@ -14,16 +14,10 @@ public interface PersonMapperInlineFactory { PersonMapperInlineFactory INSTANCE = Mappers.getMapper(PersonMapperInlineFactory.class); - @Mapping(target = "department") - @Mapping(target = "salary") - Employee toEmployee(PersonDTO dto); - - @Mapping(target = "customerId") - @Mapping(target = "tier") - Customer toCustomer(PersonDTO dto); + Person toPerson(PersonDTO dto); @ObjectFactory - default Person createPerson(Class targetType, PersonDTO dto) { + default Person createPerson(PersonDTO dto) { if ("employee".equalsIgnoreCase(dto.getType())) return new Employee(); else if ("customer".equalsIgnoreCase(dto.getType())) return new Customer(); throw new IllegalArgumentException("Unknown type: " + dto.getType());