Daftar Pemetaan dengan ModelMapper

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menerangkan cara memetakan senarai pelbagai jenis elemen menggunakan kerangka ModelMapper. Ini melibatkan penggunaan jenis generik di Jawa sebagai penyelesaian untuk menukar pelbagai jenis data dari satu senarai ke senarai yang lain .

2. Model Mapper

Peranan utama ModelMapper adalah memetakan objek dengan menentukan bagaimana satu model objek dipetakan ke yang lain yang disebut Objek Transformasi Data (DTO).

Untuk menggunakan ModelMapper, kita mulakan dengan menambahkan kebergantungan pada pom.xml kami :

 org.modelmapper modelmapper 2.3.7 

2.1. Konfigurasi

ModelMapper menyediakan pelbagai konfigurasi untuk mempermudah proses pemetaan. Kami menyesuaikan konfigurasi dengan mengaktifkan atau mematikan sifat yang sesuai dalam konfigurasi. Ia adalah satu amalan biasa untuk menetapkan fieldMatchingEnabled harta kepada benar dan membenarkan yang hampir sama medan peribadi :

modelMapper.getConfiguration() .setFieldMatchingEnabled(true) .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE); 

Dengan melakukannya, ModelMapper dapat membandingkan bidang peribadi dalam kelas pemetaan (objek). Dalam konfigurasi ini, tidak semestinya semua bidang dengan nama yang sama ada di kedua-dua kelas. Beberapa Strategi Pencocokan dibenarkan. Secara lalai, strategi pemadanan standard memerlukan semua sifat sumber dan tujuan mesti dipadankan dalam urutan apa pun. Ini sesuai untuk senario kami .

2.2. Taip Token

ModelMapper menggunakan TypeToken untuk memetakan jenis generik. Untuk mengetahui mengapa ini perlu, mari kita lihat apa yang berlaku apabila kita memetakan senarai Integer ke senarai Character :

List integers = new ArrayList(); integers.add(1); integers.add(2); integers.add(3); List characters = new ArrayList(); modelMapper.map(integers, characters);

Selanjutnya, jika kita mencetak unsur-unsur senarai watak, kita akan melihat senarai kosong. Ini disebabkan oleh berlakunya penghapusan jenis semasa pelaksanaan runtime.

Sekiranya kita menukar panggilan peta kita untuk menggunakan TypeToken , kita boleh membuat jenis literal untuk List :

List characters = modelMapper.map(integers, new TypeToken
    
     () {}.getType());
    

Pada masa kompilasi, kotak dalaman tanpa nama TokenType mengekalkan jenis parameter Senarai , dan kali ini penukaran kami berjaya.

3. Menggunakan Pemetaan Jenis Tersuai

Daftar di Java dapat dipetakan menggunakan jenis elemen tersuai.

Sebagai contoh, katakan kita mahu memetakan senarai entiti Pengguna ke senarai UserDTO . Untuk mencapainya, kami akan memanggil peta untuk setiap elemen:

List dtos = users .stream() .map(user -> modelMapper.map(user, UserDTO.class)) .collect(Collectors.toList());

Sudah tentu, dengan lebih banyak kerja, kita dapat membuat kaedah parameter tujuan umum:

 List mapList(List source, Class targetClass) { return source .stream() .map(element -> modelMapper.map(element, targetClass)) .collect(Collectors.toList()); }

Oleh itu, kita boleh melakukan:

List userDtoList = mapList(users, UserDTO.class);

4. Taipkan Peta dan Pemetaan Harta

Sifat tertentu seperti senarai atau set dapat ditambahkan ke model User-UserDTO . TypeMap menyediakan kaedah untuk menentukan secara jelas pemetaan sifat-sifat ini. The TypeMap Kedai objek maklumat jenis tertentu (kelas) pemetaan:

TypeMap typeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class);

Kelas UserList mengandungi koleksi User s. Di sini, w e mahu memetakan senarai nama pengguna dari koleksi ini ke senarai hartanah daripada UserListDTO kelas . Untuk mencapainya, kami akan membuat kelas UsersListConverter pertama dan meneruskannya List and List sebagai jenis parameter untuk penukaran:

public class UsersListConverter extends AbstractConverter
    
      { @Override protected List convert(List users) { return users .stream() .map(User::getUsername) .collect(Collectors.toList()); } }
    

Dari objek TypeMap yang dibuat, kami secara eksplisit menambahkan Pemetaan Properti dengan menggunakan contoh kelas UsersListConverter :

 typeMap.addMappings(mapper -> mapper.using(new UsersListConverter()) .map(UserList::getUsers, UserListDTO::setUsernames));

Di dalam kaedah addMappings , pemetaan ekspresi memungkinkan kita menentukan sumber ke sifat tujuan dengan ekspresi lambda. Akhirnya, ia menukar senarai pengguna menjadi senarai nama pengguna yang dihasilkan.

5. Kesimpulan

Dalam tutorial ini, kami menerangkan bagaimana senarai dipetakan dengan memanipulasi jenis generik di ModelMapper . Kita dapat memanfaatkan TypeToken, pemetaan jenis generik, dan pemetaan harta tanahuntuk membuat jenis senarai objek dan membuat pemetaan yang kompleks.

Kod sumber lengkap untuk artikel ini boleh didapati di GitHub.