Pembuat Peta Kustom dengan MapStruct

1. Ikhtisar

Di artikel ini, kita akan mempelajari cara menggunakan mapper khusus dengan pustaka MapStruct.

Perpustakaan MapStruct digunakan untuk pemetaan antara jenis kacang Java . Dengan menggunakan pembuat peta khusus dengan MapStruct , kita dapat menyesuaikan metode pemetaan default.

2. Ketergantungan Maven

Mari tambahkan pustaka mapstruct ke dalam Maven pom.xml kita :

 org.mapstruct mapstruct 1.3.1.Final 

Untuk melihat metode yang dibuat secara otomatis di dalam folder target proyek , kita harus menambahkan annotationProcessorPaths ke plugin maven-compiler- plugin:

 org.apache.maven.plugins maven-compiler-plugin 3.5.1  1.8 1.8   org.mapstruct mapstruct 1.3.1.Final    

3. Pembuat Peta Khusus

Pembuat peta kustom digunakan untuk menyelesaikan persyaratan konversi tertentu. Untuk mencapai ini, kita harus menentukan metode untuk melakukan konversi. Kemudian, kita harus memberi tahu MapStruct tentang metode tersebut. Terakhir, MapStruct akan memanggil metode untuk melakukan konversi dari sumber ke target.

Misalnya, mari kita bayangkan bahwa kita memiliki aplikasi yang menghitung laporan indeks massa tubuh (BMI) pengguna. Untuk menghitung BMI, kita harus mengumpulkan nilai tubuh pengguna. Untuk mengonversi satuan imperial menjadi satuan metrik, kita dapat menggunakan metode mapper khusus.

Ada dua cara menggunakan pembuat peta khusus dengan MapStruct. Kami baik dapat memanggil metode kustom dengan mengetikkan itu dalam @Mapping penjelasan ini qualifiedByName properti, atau kita dapat membuat anotasi untuk itu.

Sebelum kita mulai, kita harus mendefinisikan kelas DTO untuk menampung nilai imperial:

public class UserBodyImperialValuesDTO { private int inch; private int pound; // constructor, getters, and setters }

Selanjutnya, mari kita tentukan kelas DTO untuk menampung nilai metrik:

public class UserBodyValues { private double kilogram; private double centimeter; // constructor, getters, and setters }

3.1. Pembuat Peta Kustom dengan Metode

Untuk mulai menggunakan pembuat peta khusus, mari buat antarmuka dengan anotasi @Mapper :

@Mapper public interface UserBodyValuesMapper { //... }

Kedua, mari buat metode kustom kita dengan tipe pengembalian yang kita inginkan dan argumen yang perlu kita ubah. Kita harus menggunakan anotasi @ Named dengan parameter nilai untuk menginformasikan MapStruct tentang metode mapper khusus:

@Mapper public interface UserBodyValuesMapper { @Named("inchToCentimeter") public static double inchToCentimeter(int inch) { return inch * 2.54; } //... }

Dan terakhir, mari kita tentukan metode antarmuka mapper dengan anotasi @Mapping . Dalam anotasi ini, kami akan memberi tahu MapStruct tentang jenis sumber, jenis target, dan metode yang akan digunakannya:

@Mapper public interface UserBodyValuesMapper { UserBodyValuesMapper INSTANCE = Mappers.getMapper(UserBodyValuesMapper.class); @Mapping(source = "inch", target = "centimeter", qualifiedByName = "inchToCentimeter") public UserBodyValues userBodyValuesMapper(UserBodyImperialValuesDTO dto); @Named("inchToCentimeter") public static double inchToCentimeter(int inch) { return inch * 2.54; } }

Mari kita uji mapper khusus kita:

UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO(); dto.setInch(10); UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto); assertNotNull(obj); assertEquals(25.4, obj.getCentimeter(), 0); 

3.2. Pembuat Peta Kustom dengan Anotasi

Untuk menggunakan mapper khusus dengan anotasi, kita harus mendefinisikan anotasi, bukan anotasi @Named . Kemudian, kita harus menginformasikan MapStruct tentang penjelasan yang baru dibuat dengan menentukan @ Pemetaan penjelasan ini qualifiedByName parameter .

Mari kita lihat bagaimana kita mendefinisikan anotasi:

@Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface PoundToKilogramMapper { }

Mari tambahkan anotasi @PoundToKilogramMapper ke metode poundToKilogram kita :

@PoundToKilogramMapper public static double poundToKilogram(int pound) { return pound * 0.4535; } 

Sekarang, mari kita tentukan metode antarmuka mapper dengan anotasi @Mapping . Dalam anotasi pemetaan, kami akan memberi tahu MapStruct tentang jenis sumber, jenis target, dan kelas anotasi yang akan digunakan:

@Mapper public interface UserBodyValuesMapper { UserBodyValuesMapper INSTANCE = Mappers.getMapper(UserBodyValuesMapper.class); @Mapping(source = "pound", target = "kilogram", qualifiedBy = PoundToKilogramMapper.class) public UserBodyValues userBodyValuesMapper(UserBodyImperialValuesDTO dto); @PoundToKilogramMapper public static double poundToKilogram(int pound) { return pound * 0.4535; } }

Terakhir, mari kita uji mapper kustom kita:

UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO(); dto.setPound(100); UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto); assertNotNull(obj); assertEquals(45.35, obj.getKilogram(), 0); 

4. Kesimpulan

Di artikel ini, kami mempelajari cara menggunakan pembuat peta khusus dengan pustaka MapStruct.

Implementasi dari contoh dan pengujian ini tersedia di GitHub.