Kortlægningslister med ModelMapper

1. Oversigt

I denne vejledning forklarer vi, hvordan man kortlægger lister over forskellige elementtyper ved hjælp af ModelMapper-rammen. Dette indebærer at bruge generiske typer i Java som en løsning til at konvertere forskellige typer data fra en liste til en anden .

2. Modelkort

ModelMapper's hovedrolle er at kortlægge objekter ved at bestemme, hvordan en objektmodel kortlægges til en anden kaldet et datatransformationsobjekt (DTO).

For at bruge ModelMapper starter vi med at tilføje afhængigheden af ​​vores pom.xml:

 org.modelmapper modelmapper 2.3.7 

2.1. Konfiguration

ModelMapper tilbyder en række konfigurationer for at forenkle kortlægningsprocessen. Vi tilpasser konfigurationen ved at aktivere eller deaktivere de relevante egenskaber i konfigurationen. Det er en almindelig praksis for at indstille fieldMatchingEnabled ejendom til rigtigt og tillad matchning af privat felt:

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

Ved at gøre dette kan ModelMapper sammenligne private felter i kortlægningsklasser (objekter). I denne konfiguration er det ikke strengt nødvendigt, at alle felter med de samme navne findes i begge klasser. Flere matchende strategier er tilladt. Som standard kræver en standard matchningsstrategi, at alle kilde- og destinationsegenskaber skal matches i en hvilken som helst rækkefølge. Dette er ideelt til vores scenario.

2.2. Skriv Token

ModelMapper bruger TypeToken til at kortlægge generiske typer. For at se hvorfor dette er nødvendigt, lad os se hvad der sker, når vi kortlægger en Heltal liste til en Karakter liste:

Liste heltal = ny ArrayList (); heltal.add (1); heltal.add (2); heltal.add (3); Liste tegn = ny ArrayList (); modelMapper.map (heltal, tegn);

Yderligere, hvis vi udskriver elementerne i tegn liste ville vi se en tom liste. Dette skyldes forekomsten af ​​type sletning under kørsel af runtime.

Hvis vi ændrer vores kort kald til brug TypeTokendog kan vi oprette en bogstavelig type for Liste :

Liste tegn = modelMapper.map (heltal, nyt TypeToken() {} .getType ());

På kompileringstidspunktet er den TokenType anonym indre sag bevarer Liste parametertype, og denne gang er vores konvertering vellykket.

3. Brug af brugerdefineret type kortlægning

Lister i Java kan kortlægges ved hjælp af brugerdefinerede elementtyper.

Lad os for eksempel sige, at vi vil kortlægge en liste over Bruger enheder til en UserDTO liste. For at opnå dette, ringer vi kort for hvert element:

Liste dtos = brugere .stream () .map (bruger -> modelMapper.map (bruger, UserDTO.class)) .collect (Collectors.toList ());

Selvfølgelig, med noget mere arbejde, kunne vi lave en parametreret metode til generelle formål:

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

Så vi kunne i stedet gøre:

Liste userDtoList = mapList (brugere, UserDTO.class);

4. Skriv kort og ejendomskortlægning

Specifikke egenskaber såsom lister eller sæt kan føjes til Bruger-BrugerDTO model. Type kort giver en metode til eksplicit at definere kortlægningen af ​​disse egenskaber. Det Type kort objekt gemmer kortoplysninger af specifikke typer (klasser):

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

Brugerliste klasse indeholder en samling af Brugers. Her, w e ønsker at kortlægge listen over brugernavne fra denne samling til ejendomslisten af UserListDTO klasse. For at opnå dette opretter vi først UsersListConverter klasse og bestå den Liste og Liste som parametertyper til konvertering:

public class UsersListConverter udvider AbstractConverter {@Override-beskyttet listekonverter (listebrugere) {returnerer brugere .stream () .map (bruger :: getUsername) .collect (Collectors.toList ()); }}

Fra det skabte Type kort objekt, vi tilføjer eksplicit Property Mapping ved at påkalde en forekomst af UsersListConverter klasse:

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

Inde i addMappings metode tillader en ekspressionskortlægning os at definere kilden til destinationsegenskaber med lambda-udtryk. Endelig konverterer den listen over brugere til den resulterende liste over brugernavne.

5. Konklusion

I denne vejledning forklarede vi, hvordan lister kortlægges ved at manipulere generiske typer i ModelMapper. Vi kan gøre brug af TypeToken, kortlægning af generisk type og kortlægning af egenskaberfor at oprette objektliste typer og lave komplekse kortlægninger.

Den komplette kildekode til denne artikel er tilgængelig på GitHub.


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