Mapovanie zoznamov pomocou ModelMapper

1. Prehľad

V tomto tutoriáli vysvetlíme, ako mapovať zoznamy rôznych typov prvkov pomocou rámca ModelMapper. Týka sa to použitia generických typov v prostredí Java ako riešenia na prevod rôznych typov údajov z jedného zoznamu do druhého .

2. Model Mapper

Hlavnou úlohou ModelMapperu je mapovať objekty určením toho, ako je jeden objektový model mapovaný do iného zvaného Data Transformation Object (DTO).

Aby sme mohli ModelMapper používať, začneme pridaním závislosti do našej pom.xml:

 org.modelmapper modelmapper 2.3.7 

2.1. Konfigurácia

ModelMapper poskytuje rôzne konfigurácie na zjednodušenie procesu mapovania. Konfiguráciu prispôsobíme povolením alebo zakázaním príslušných vlastností v konfigurácii. Je to bežná prax stanovovania fieldMatchingEnabled majetok do pravda a povoliť porovnávanie v súkromnom poli:

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

Týmto spôsobom môže ModelMapper porovnávať súkromné ​​polia v mapovacích triedach (objektoch). V tejto konfigurácii nie je nevyhnutne potrebné, aby v obidvoch triedach existovali všetky polia s rovnakými názvami. Je povolených niekoľko stratégií párovania. Štandardne štandardná stratégia priraďovania vyžaduje, aby sa všetky zdrojové a cieľové vlastnosti zhodovali v ľubovoľnom poradí. To je ideálne pre náš scenár.

2.2. Typ Token

ModelMapper používa TypeToken na mapovanie všeobecných typov. Aby sme zistili, prečo je to nevyhnutné, pozrime sa, čo sa stane, keď mapujeme Celé číslo zoznam do a Postava zoznam:

Zoznam celých čísel = new ArrayList (); integers.add (1); integers.add (2); integers.add (3); Zoznam znakov = nový ArrayList (); modelMapper.map (celé čísla, znaky);

Ďalej, ak vytlačíme prvky znakov zoznam by sme videli prázdny zoznam. Je to z dôvodu výskytu vymazania typu počas vykonávania modulu runtime.

Ak zmeníme svoje mapa volanie použiť TypeToken, aj keď môžeme vytvoriť typový literál pre Zoznam :

Zoznam znakov = modelMapper.map (celé čísla, nový TypeToken() {} .getType ());

V čase kompilácie TokenType anonymný vnútorný prípad zachováva Zoznam typu parametra a naša konverzia je tentokrát úspešná.

3. Používanie vlastného mapovania typov

Zoznamy v Jave je možné mapovať pomocou vlastných typov prvkov.

Povedzme napríklad, že chceme zmapovať zoznam Používateľ subjekty k a UserDTO zoznam. Aby sme to dosiahli, zavoláme mapa pre každý prvok:

Zoznam dtos = používatelia .stream () .map (užívateľ -> modelMapper.map (užívateľ, UserDTO.class)) .collect (Collectors.toList ());

Samozrejme, s ešte niekoľkými prácami by sme mohli vytvoriť univerzálnu parametrizovanú metódu:

 Zoznam mapList (Zoznam zdrojov, Trieda targetClass) {návratový zdroj .stream () .map (element -> modelMapper.map (element, targetClass)) .collect (Collectors.toList ()); }

Takže by sme mohli namiesto toho urobiť:

Zoznam userDtoList = mapList (používatelia, UserDTO.class);

4. Napíšte Mapy a Mapy nehnuteľností

Do súboru je možné pridať špecifické vlastnosti, ako sú zoznamy alebo množiny User-UserDTO Model. TypeMap poskytuje metódu na explicitné definovanie mapovania týchto vlastností. The TypeMap objekt ukladá mapovacie informácie konkrétnych typov (tried):

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

Zoznam používateľov trieda obsahuje zbierku Používateľs. Tu, w Chcem mapovať zoznam používateľských mien z tejto kolekcie do zoznamu vlastností z UserListDTO trieda. Aby sme to dosiahli, najskôr vytvoríme UsersListConverter triedy a zložiť to Zoznam a Zoznam ako typy parametrov pre prevod:

verejná trieda UsersListConverter rozširuje AbstractConverter {@Override chránený prevod zoznamu (zoznam používateľov) {návrat používateľov .stream () .map (User :: getUsername) .collect (Collectors.toList ()); }}

Z vytvoreného TypeMap objekt explicitne pridávame mapovanie vlastností vyvolaním inštancie UsersListConverter trieda:

 typeMap.addMappings (mapovač -> mapper.using (nový UsersListConverter ()) .map (UserList :: getUsers, UserListDTO :: setUsernames));

Vnútri addMappings metóda, mapovanie výrazov nám umožňuje definovať vlastnosti zdroja k cieľu pomocou výrazov lambda. Nakoniec prevedie zoznam používateľov na výsledný zoznam používateľských mien.

5. Záver

V tomto tutoriáli sme vysvetlili, ako sa zoznamy mapujú manipuláciou s generickými typmi v ModelMapper. Môžeme využiť TypeToken, mapovanie generického typu a mapovanie vlastnostívytvárať typy zoznamov objektov a vytvárať zložité mapovania.

Kompletný zdrojový kód tohto článku je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found