MapStruct Nedir? Spring Boot MapStruct Uygulama Örneği
İlgini Çekebilir: Spring Boot Dersleri
MapStruct, 2014 yılında başlayan ve ilk sürümünü 2017 yılında çıkan Java nesnelerimizi farklı nesnelere kolaylıkla mapleme işlemi yapmamızı sağlayan bir kütüphanedir.
MapStruct ile birlikte Data Transfer Object (DTO)’larımızı belirlediğimiz kriterlerimize göre mapper işlemlerimizi otomatik olarak yapabilmekteyiz.
Uygulamamızın business katmanı ile data katmanını ayırarak, gereksiz alanları diğer katmanlara taşımasını önleyebilmekteyiz. Bu katmanı dış api’ler ile de kullanabilmekteyiz. Bu dönüşümleri hızlandırıp, pratik bir şekilde kullanmamızı sağlamaktadır.
Uygulama Örneği
Spring Boot uygulamasında öğrenci bilgilerinin tutulduğu bir servis olacak ve rest apimiz de bu bilgilerin sadece bazı alanlarını açarak yayınlayacağız. Uygulamamız bir spring boot uygulamamıza map struct kütüphanesini ekleyelim.
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.1.Final</version>
</dependency>
Code language: HTML, XML (xml)
maven dosyamıza ayrıca mapper dosyalarını yazılımımız çalıştıktan sonra oluşturması için aşağıdaki build bölümüne plugini eklemeliyiz.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
Code language: HTML, XML (xml)
Bu ayarları yaptıktan sonra Student entitymizi ve StudentDTO muzu oluşturalım.
public class Student {
private long id;
private long tcNumber;
private String nameSurname;
private String motherName;
private String fatherName;
private int age;
private String schoolName;
private String country;
private String city;
private String postalCode;
private String schoolScore;
private String healthNotes;
private String teacherNotes;
}
Code language: Java (java)
Yukarıda yer alan tüm bilgilerin dış servislere açmamak için StudentDTO’muz olucak.
public class StudentDto {
private long id;
private String nameSurname;
private String schoolName;
}
Code language: Java (java)
Oluşturacağımız Rest servisimiz için sunacağımız verileri StudentDTO’da göstereceğiz.
Verilerimiz Student entity’sinden StudentDto’ya çevirecek olan mapping interface’yi oluşturalım. Bu interface sayesinde metodlarımızın çevrimi yapılacak metot tanımlamalarını yapacağız.
@Mapper(componentModel = "spring")
public interface StudentMapper {
Student map(StudentDto studentDto);
StudentDto map(Student student);
}
Code language: Java (java)
Oluşturduğumuz metotlar karşılıklı olarak mapping işleminin yapılmasını sağlamaktadır. Mapper
ile springe referans oluşturarak kullanabiliyoruz. Classlarımızın alan adları aynı olduğu sürece otomatik olarak binding yapılabilir.
Oluşturduğumuz metotlarımıza ise Mappers
ile alan tanımlamalarını spesifik olarak belirtebiliriz. Belirlediğimiz alanların isimleri farklı olduğunda bu alan tanımlamasını tek tek özellikle belirtebiliyoruz. Örnek olarak;
@Mapping(source = "student.id", target = "id")
Code language: CSS (css)
Student sınıfındaki id alanını StudentDto alanında id alanına binding edebiliyoruz. Bunlar farklı alanlar olduğunda kullanabiliyoruz.
Student Controller oluşturalım ve Student’e verilerimizi gireceğiz StudentDTO’ya mapping işlemini yaparak rest servisine göndermiş olacağız.
@RestController
public class StudentController {
private final StudentMapper studentMapper;
public StudentController(StudentMapper studentMapper) {
this.studentMapper = studentMapper;
}
@GetMapping
public ResponseEntity getStudentDto() {
Student student = new Student();
student.setAge(18);
student.setCity("Antalya");
student.setFatherName("Ahmet");
student.setMotherName("Ayşe");
student.setHealthNotes("Sağlıklı");
student.setTcNumber(123456L);
student.setTeacherNotes("Çalışkan");
student.setSchoolScore("76");
student.setPostalCode("95014");
student.setNameSurname("Mehmet");
student.setId(1L);
student.setSchoolName("Java School");
StudentDto studentDto = studentMapper.map(student);
return ResponseEntity.ok(studentDto);
}
}
Code language: Java (java)
Burada Student sınıfımızın tüm verileri dolu olmasına rağmen, StudentDTO sınıfına mapping yapıyoruz ve rest çağrısı sonucunda bize gelen değerimize bakalım.
{
"id": 1,
"nameSurname": "Mehmet",
"schoolName": "Java School"
}
Code language: JSON / JSON with Comments (json)
Mapping sayesinde verilerimizin bindingi yapılarak dönüşümü Mapstruct aracılığı ile yapabiliyoruz.
No Comment! Be the first one.