Mapper tersuai dengan MapStruct

1. Gambaran keseluruhan

Dalam artikel ini, kita akan belajar bagaimana menggunakan mapper tersuai dengan perpustakaan MapStruct.

Perpustakaan MapStruct digunakan untuk pemetaan antara jenis kacang Jawa . Dengan menggunakan mapper khusus dengan MapStruct , kita dapat menyesuaikan kaedah pemetaan lalai.

2. Pergantungan Maven

Mari tambahkan perpustakaan peta peta ke dalam Maven pom.xml kami :

 org.mapstruct mapstruct 1.3.1.Final 

Untuk melihat kaedah yang dihasilkan secara automatik di dalam folder sasaran projek , kita harus menambahkan anotationProcessorPaths 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. Mapper tersuai

Pemetaan khusus digunakan untuk menyelesaikan keperluan penukaran tertentu. Untuk mencapai ini, kita harus menentukan kaedah untuk melakukan penukaran. Kemudian, kita mesti memberitahu MapStruct mengenai kaedahnya. Akhirnya, MapStruct akan memanggil kaedah untuk melakukan penukaran dari sumber ke sasaran.

Sebagai contoh, mari kita bayangkan bahawa kita mempunyai aplikasi yang mengira laporan indeks jisim badan (BMI) pengguna. Untuk mengira BMI, kita harus mengumpulkan nilai badan pengguna. Untuk menukar unit imperial menjadi unit metrik, kita dapat menggunakan kaedah mapper tersuai.

Terdapat dua cara menggunakan mapper tersuai dengan MapStruct. Kita boleh memanggil kaedah kustom dengan menaipnya di dalam properti @BetaName anotasi yang memenuhi syarat , atau kita boleh membuat anotasi untuknya.

Sebelum memulakan, kita harus menentukan kelas DTO untuk memegang nilai-nilai imperial:

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

Seterusnya, mari tentukan kelas DTO untuk menahan nilai metrik:

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

3.1. Mapper Tersuai dengan Kaedah

Untuk mula menggunakan pemetaan khusus, mari buat antaramuka dengan anotasi @Mapper :

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

Kedua, mari buat kaedah khusus kami dengan jenis pengembalian yang kami mahukan dan argumen yang perlu kami ubah. Kita harus menggunakan anotasi @ Named dengan parameter nilai untuk memberitahu MapStruct mengenai kaedah mapper tersuai:

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

Dan akhirnya, mari kita tentukan kaedah antara muka mapper dengan anotasi @Mapping . Dalam penjelasan ini, kami akan memberitahu MapStruct mengenai jenis sumber, jenis sasaran, dan kaedah 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 tersuai kami:

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

3.2. Mapper Tersuai dengan Anotasi

Untuk menggunakan mapper tersuai dengan anotasi, kita harus menentukan anotasi dan bukannya anotasi @Nama . Kemudian, kita perlu memberitahu MapStruct mengenai anotasi yang baru diwujudkan dengan menentukan @ Pemetaan anotasi qualifiedByName parameter .

Mari lihat bagaimana kita menentukan penjelasan:

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

Mari kita menambah @PoundToKilogramMapper anotasi untuk kami poundToKilogram kaedah:

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

Sekarang, mari kita tentukan kaedah antara muka mapper dengan anotasi @Mapping . Dalam anotasi pemetaan, kami akan memberitahu MapStruct mengenai jenis sumber, jenis sasaran, dan kelas anotasi yang akan digunakannya:

@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; } }

Akhirnya, mari kita uji mapper tersuai kami:

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

4. Kesimpulan

Dalam artikel ini, kami belajar bagaimana menggunakan mapper khusus dengan perpustakaan MapStruct.

Pelaksanaan contoh dan ujian ini boleh didapati di GitHub.