Mapiranje popisa pomoću ModelMapper

1. Pregled

U ovom uputstvu objasnit ćemo kako mapirati popise različitih tipova elemenata pomoću okvira ModelMapper. To uključuje upotrebu generičkih tipova u Javi kao rješenje za pretvaranje različitih vrsta podataka s jednog popisa na drugi .

2. Mapper modela

Glavna uloga ModelMapper-a je mapiranje objekata određivanjem kako se jedan objektni model preslikava na drugi koji se naziva objekt transformacije podataka (DTO).

Da bismo koristili ModelMapper, započinjemo dodavanjem ovisnosti u naš pom.xml:

 org.modelmapper modelmapper 2.3.7 

2.1. Konfiguracija

ModelMapper nudi razne konfiguracije za pojednostavljivanje postupka mapiranja. Konfiguraciju prilagođavamo omogućavanjem ili onemogućavanjem odgovarajućih svojstava u konfiguraciji. To je uobičajena praksa postavljanja fieldMatchingEnabled svojstvo da pravi i dopustiti podudaranje privatnih polja:

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

Na taj način ModelMapper može uspoređivati ​​privatna polja u klasama preslikavanja (objektima). U ovoj konfiguraciji nije strogo neophodno da sva polja s istim imenima postoje u obje klase. Dopušteno je nekoliko podudarnih strategija. Prema zadanim postavkama, standardna strategija podudaranja zahtijeva da se sva svojstva izvora i odredišta moraju podudarati u bilo kojem redoslijedu. Ovo je idealno za naš scenarij.

2.2. Upišite žeton

ModelMapper koristi TypeToken za mapiranje generičkih tipova. Da bismo vidjeli zašto je to potrebno, pogledajmo što se događa kada mapiramo an Cijeli broj popis na a Lik popis:

Popis cijelih brojeva = novi ArrayList (); cijeli brojevi.add (1); cijeli brojevi.add (2); cijeli brojevi.add (3); Popis znakova = novi ArrayList (); modelMapper.map (cijeli brojevi, znakovi);

Dalje, ako ispišemo elemente likova popis vidjeli bismo prazan popis. To je zbog pojave brisanja tipa tijekom izvođenja izvršavanja.

Ako promijenimo svoje karta poziv na upotrebu TypeToken, međutim, možemo stvoriti literal tipa za Popis :

Popis znakova = modelMapper.map (cijeli brojevi, novi TypeToken() {} .getType ());

U vrijeme sastavljanja, TokenType anonimni unutarnji slučaj čuva Popis tipa parametra i ovaj je put naša pretvorba uspješna.

3. Korištenje prilagođenog mapiranja tipova

Popisi u Javi mogu se mapirati pomoću prilagođenih vrsta elemenata.

Na primjer, recimo da želimo mapirati popis Korisnik entiteta na a UserDTO popis. Da bismo to postigli, nazvat ćemo karta za svaki element:

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

Naravno, uz još malo rada, mogli bismo napraviti općenito parametarsku metodu:

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

Pa bismo, umjesto toga, mogli učiniti:

Popis userDtoList = mapList (korisnici, UserDTO.class);

4. Upišite kartu i mapiranje svojstava

Specifična svojstva poput popisa ili skupova mogu se dodati u Korisnik-korisnikDTO model. UpišiteMap pruža metodu za izričito definiranje mapiranja tih svojstava. The UpišiteMap objekt pohranjuje podatke o mapiranju određenih vrsta (klasa):

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

Popis korisnika razred sadrži zbirku Korisniks. Evo, w Želimo mapirati popis korisničkih imena iz ove kolekcije na popis svojstava od UserListDTO razred. Da bismo to postigli, prvo ćemo stvoriti UsersListConverter razredu i položite ga Popis i Popis kao vrste parametara za pretvorbu:

javna klasa UsersListConverter proširuje AbstractConverter {@ Oververde protected List convert (Lista korisnika) {return users .stream () .map (User :: getUsername) .collect (Collectors.toList ()); }}

Od stvorenog UpišiteMap objekt koji izričito dodamo Mapiranje svojstava pozivanjem instance UsersListConverter razred:

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

Unutar addMappings metodom, mapiranje izraza omogućuje nam definiranje svojstava izvora do odredišta s lambda izrazima. Konačno, pretvara popis korisnika u rezultirajući popis korisničkih imena.

5. Zaključak

U ovom smo tutorijalu objasnili kako se popisi mapiraju manipuliranjem generičkih tipova u ModelMapper. Možemo se koristiti TypeToken, mapiranje generičkog tipa i mapiranje svojstavaza stvaranje vrsta popisa objekata i izradu složenih preslikavanja.

Kompletni izvorni kod za ovaj članak dostupan je na GitHubu.