Skip to content

Commit 657539d

Browse files
arpendu11Arpendu Kumar Garai
andauthored
mapstruct guide (thombergs#192)
Co-authored-by: Arpendu Kumar Garai <[email protected]>
1 parent f3064e5 commit 657539d

24 files changed

+571
-0
lines changed

mapstruct/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Related Blog Posts
2+
3+
* [One-Stop Guide to Mapping with MapStruct](https://reflectoring.io/one-stop-guide-mapstruct/)
4+

mapstruct/pom.xml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>io.reflectoring</groupId>
8+
<artifactId>mapstruct</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
<properties>
12+
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
13+
<org.projectlombok.version>1.18.24</org.projectlombok.version>
14+
<maven.compiler.source>8</maven.compiler.source>
15+
<maven.compiler.target>8</maven.compiler.target>
16+
</properties>
17+
18+
<dependencies>
19+
<dependency>
20+
<groupId>org.mapstruct</groupId>
21+
<artifactId>mapstruct</artifactId>
22+
<version>${org.mapstruct.version}</version>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.projectlombok</groupId>
26+
<artifactId>lombok</artifactId>
27+
<version>${org.projectlombok.version}</version>
28+
<scope>provided</scope>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.slf4j</groupId>
32+
<artifactId>slf4j-api</artifactId>
33+
<version>1.7.36</version>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.slf4j</groupId>
37+
<artifactId>slf4j-log4j12</artifactId>
38+
<version>1.7.36</version>
39+
</dependency>
40+
</dependencies>
41+
42+
<build>
43+
<plugins>
44+
<plugin>
45+
<groupId>org.apache.maven.plugins</groupId>
46+
<artifactId>maven-compiler-plugin</artifactId>
47+
<version>3.8.1</version>
48+
<configuration>
49+
<source>1.8</source>
50+
<target>1.8</target>
51+
<annotationProcessorPaths>
52+
<path>
53+
<groupId>org.mapstruct</groupId>
54+
<artifactId>mapstruct-processor</artifactId>
55+
<version>${org.mapstruct.version}</version>
56+
</path>
57+
<path>
58+
<groupId>org.projectlombok</groupId>
59+
<artifactId>lombok</artifactId>
60+
<version>${org.projectlombok.version}</version>
61+
</path>
62+
<!-- additional annotation processor required as of Lombok 1.18.16 -->
63+
<path>
64+
<groupId>org.projectlombok</groupId>
65+
<artifactId>lombok-mapstruct-binding</artifactId>
66+
<version>0.2.0</version>
67+
</path>
68+
</annotationProcessorPaths>
69+
<!-- due to problem in maven-compiler-plugin, for verbose mode add showWarnings -->
70+
<showWarnings>true</showWarnings>
71+
<compilerArgs>
72+
<arg>
73+
-Amapstruct.suppressGeneratorTimestamp=true
74+
</arg>
75+
<arg>
76+
-Amapstruct.suppressGeneratorVersionInfoComment=true
77+
</arg>
78+
<arg>
79+
-Amapstruct.verbose=true
80+
</arg>
81+
<arg>
82+
-Amapstruct.defaultComponentModel=default
83+
</arg>
84+
</compilerArgs>
85+
</configuration>
86+
</plugin>
87+
</plugins>
88+
</build>
89+
90+
</project>
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.reflectoring;
2+
3+
import io.reflectoring.dto.BasicUserDTO;
4+
import io.reflectoring.dto.EducationDTO;
5+
import io.reflectoring.dto.PersonDTO;
6+
import io.reflectoring.mappers.CollectionMapper;
7+
import io.reflectoring.mappers.UserMapper;
8+
import io.reflectoring.model.*;
9+
import lombok.extern.slf4j.Slf4j;
10+
11+
import java.util.*;
12+
import java.util.stream.Stream;
13+
14+
@Slf4j
15+
public class MappingGuide {
16+
public static void main(String[] args) {
17+
log.info("MapStruct Mapping conversion started !!");
18+
19+
Manager manager = Manager
20+
.builder()
21+
.id(2)
22+
.name("Adam Smith")
23+
.build();
24+
BasicUser user = BasicUser
25+
.builder()
26+
.id(1)
27+
.name("John Doe")
28+
.managerList(Collections.singletonList(manager))
29+
.build();
30+
log.info("User details: {}", user);
31+
32+
BasicUserDTO dto = UserMapper.INSTANCE.convert(user);
33+
log.info("UserDTO details: {}", dto);
34+
35+
BasicUser anotherUser = UserMapper.INSTANCE.convert(dto);
36+
log.info("User details: {}", anotherUser);
37+
38+
Education education = Education
39+
.builder()
40+
.degreeName("M.S.")
41+
.institute("Carnegie Mellon University")
42+
.yearOfPassing(2021)
43+
.build();
44+
Address address = Address
45+
.builder()
46+
.houseNo("25A")
47+
.landmark("Decker's lane")
48+
.city("New York")
49+
.country("USA")
50+
.zipcode("10001")
51+
.build();
52+
Employment employment = Employment
53+
.builder()
54+
.designation(DesignationCode.CEO)
55+
.salary(300000L)
56+
.build();
57+
PersonDTO personDTO = UserMapper.INSTANCE.convert(user, education, address, employment);
58+
UserMapper.INSTANCE.updateExisting(user, education, address, employment, personDTO);
59+
log.info("PersonDTO details: {}", personDTO);
60+
61+
Set<Long> ids = new HashSet<>(Arrays.asList(100000L, 100001L, 100002L));
62+
Set<String> set = CollectionMapper.INSTANCE.convert(ids);
63+
Set<String> streamSet = CollectionMapper.INSTANCE.convertStream(ids.parallelStream());
64+
log.info("Set of String: {}", set);
65+
log.info("Set of String from Streams: {}", streamSet);
66+
67+
List<EducationDTO> educationDTO = CollectionMapper.INSTANCE.convert(Collections.singletonList(education));
68+
List<EducationDTO> educationDTOFromStream = CollectionMapper.INSTANCE.convert(Stream.of(education));
69+
log.info("List of Education: {}", educationDTO);
70+
log.info("List of Education from Stream: {}", educationDTOFromStream);
71+
72+
Map<Long, Date> dateMap = new HashMap<>();
73+
dateMap.put(100000L, new Date());
74+
dateMap.put(100001L, new Date());
75+
Map<String, String> map = CollectionMapper.INSTANCE.map(dateMap);
76+
log.info("Map of dates: {}", map);
77+
78+
log.info("MapStruct Mapping conversion completed !!");
79+
}
80+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.reflectoring.decorators;
2+
3+
import io.reflectoring.dto.PersonDTO;
4+
import io.reflectoring.mappers.UserMapper;
5+
import io.reflectoring.model.Address;
6+
import io.reflectoring.model.BasicUser;
7+
import io.reflectoring.model.Education;
8+
import io.reflectoring.model.Employment;
9+
10+
public abstract class UserMapperDecorator implements UserMapper {
11+
12+
private final UserMapper delegate;
13+
14+
protected UserMapperDecorator (UserMapper delegate) {
15+
this.delegate = delegate;
16+
}
17+
18+
@Override
19+
public PersonDTO convert(BasicUser user, Education education, Address address, Employment employment) {
20+
PersonDTO dto = delegate.convert(user, education, address, employment);
21+
if (user.getName().split("\\w+").length > 1) {
22+
dto.setFirstName(user.getName().substring(0, user.getName().lastIndexOf(' ')));
23+
dto.setLastName(user.getName().substring(user.getName().lastIndexOf(" ") + 1));
24+
}
25+
else {
26+
dto.setFirstName(user.getName());
27+
}
28+
return dto;
29+
}
30+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.reflectoring.dto;
2+
3+
import lombok.*;
4+
5+
@Data
6+
@Builder
7+
@ToString
8+
public class BasicUserDTO {
9+
private String id;
10+
private String name;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.reflectoring.dto;
2+
3+
public enum DegreeStreamPrefix {
4+
MSC_MATHS,
5+
MSC_PHYSICS,
6+
MSC_CHEMISTRY,
7+
MSC_BOTANY,
8+
MSC_ZOOLOGY,
9+
MSC_STATISTICS,
10+
MSC_EDUCATION
11+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.reflectoring.dto;
2+
3+
public enum DesignationConstant {
4+
CHIEF_EXECUTIVE_OFFICER,
5+
CHIEF_TECHNICAL_OFFICER,
6+
VICE_PRESIDENT,
7+
SENIOR_MANAGER,
8+
MANAGER,
9+
ARCHITECT,
10+
SENIOR_SOFTWARE_ENGINEER,
11+
SOFTWARE_ENGINEER,
12+
INTERN,
13+
OTHERS
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.reflectoring.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.ToString;
6+
7+
@Data
8+
@Builder
9+
@ToString
10+
public class EducationDTO {
11+
private String degree;
12+
private String college;
13+
private Integer passingYear;
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.reflectoring.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.ToString;
6+
7+
@Data
8+
@Builder
9+
@ToString
10+
public class EmploymentDTO {
11+
private String designation;
12+
private long salary;
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.reflectoring.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.ToString;
6+
7+
import java.util.Date;
8+
9+
@Data
10+
@Builder
11+
@ToString
12+
public class ManagerDTO {
13+
private int id;
14+
private String name;
15+
private Date dateOfBirth;
16+
}

0 commit comments

Comments
 (0)