Lijsten in kaart brengen met ModelMapper

1. Overzicht

In deze zelfstudie leggen we uit hoe u lijsten met verschillende elementtypen toewijst met behulp van het ModelMapper-framework. Dit omvat het gebruik van generieke typen in Java als een oplossing om verschillende soorten gegevens van de ene lijst naar de andere te converteren .

2. Modelmapper

De belangrijkste rol van ModelMapper is het in kaart brengen van objecten door te bepalen hoe het ene objectmodel wordt toegewezen aan het andere, een Data Transformation Object (DTO).

Om ModelMapper te gebruiken, beginnen we met het toevoegen van de afhankelijkheid aan onze pom.xml:

 org.modelmapper modelmapper 2.3.7 

2.1. Configuratie

ModelMapper biedt een verscheidenheid aan configuraties om het mappingproces te vereenvoudigen. We passen de configuratie aan door de juiste eigenschappen in de configuratie in of uit te schakelen. Het is een gangbare praktijk om de fieldMatchingEnabled eigendom aan waar en sta afstemming van privévelden toe:

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

Door dit te doen, kan ModelMapper privévelden in de toewijzingsklassen (objecten) vergelijken. In deze configuratie is het niet strikt noodzakelijk dat alle velden met dezelfde naam in beide klassen voorkomen. Meerdere afstemmingsstrategieën zijn toegestaan. Standaard vereist een standaard matchstrategie dat alle bron- en bestemmingseigenschappen in willekeurige volgorde overeenkomen. Dit is ideaal voor ons scenario.

2.2. Typ Token

ModelMapper gebruikt TypeToken om generieke typen toe te wijzen. Om te zien waarom dit nodig is, laten we eens kijken wat er gebeurt als we een Geheel getal lijst naar een Karakter lijst:

Lijst gehele getallen = nieuwe ArrayList (); gehele getallen.add (1); gehele getallen.add (2); gehele getallen.add (3); Lijsttekens = nieuwe ArrayList (); modelMapper.map (gehele getallen, karakters);

Verder, als we de elementen van het karakters lijst zouden we een lege lijst zien. Dit komt doordat het type wordt gewist tijdens runtime-uitvoering.

Als we onze kaart oproep om te gebruiken TypeToken, maar we kunnen een lettertype maken voor Lijst :

Lijsttekens = modelMapper.map (gehele getallen, nieuw TypeToken() {} .getType ());

Tijdens het compileren is het TokenType anonieme binnenbehuizing behoudt de Lijst parametertype, en deze keer is onze conversie succesvol.

3. Gebruik van aangepaste typetoewijzing

Lijsten in Java kunnen in kaart worden gebracht met behulp van aangepaste elementtypen.

Laten we bijvoorbeeld zeggen dat we een lijst met Gebruiker entiteiten naar een UserDTO lijst. Om dit te bereiken, zullen we bellen kaart voor elk element:

Lijst dtos = gebruikers .stream () .map (gebruiker -> modelMapper.map (gebruiker, UserDTO.class)) .collect (Collectors.toList ());

Natuurlijk zouden we met wat meer werk een algemene geparametriseerde methode kunnen maken:

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

Dus we zouden in plaats daarvan kunnen doen:

Lijst userDtoList = mapList (gebruikers, UserDTO.class);

4. Typ Kaart en Eigenschapstoewijzing

Specifieke eigenschappen zoals lijsten of sets kunnen aan het Gebruiker-UserDTO model. TypeMap biedt een methode om de toewijzing van deze eigenschappen expliciet te definiëren. De Typ kaart object slaat kaartinformatie van specifieke typen (klassen) op:

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

Gebruikers lijst class bevat een verzameling van Gebruikers. Hier, w We willen de lijst met gebruikersnamen uit deze collectie toewijzen aan de eigenschappenlijst van de UserListDTO klasse. Om dit te bereiken, zullen we eerst creëren UsersListConverter klasse en geef het door Lijst en Lijst als parametertypen voor conversie:

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

Van het gecreëerde Typ kaart object voegen we expliciet Property Mapping toe door een instantie van aan te roepen UsersListConverter klasse:

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

Binnen in de addMappings methode, een expressie-mapping stelt ons in staat om de bron naar bestemmingseigenschappen te definiëren met lambda-expressies. Ten slotte converteert het de lijst met gebruikers naar de resulterende lijst met gebruikersnamen.

5. Conclusie

In deze tutorial hebben we uitgelegd hoe lijsten worden toegewezen door generieke typen in ModelMapper te manipuleren. We kunnen er gebruik van maken TypeToken, generieke typetoewijzing en eigenschapstoewijzingom objectlijsttypen te maken en complexe toewijzingen te maken.

De volledige broncode voor dit artikel is beschikbaar op GitHub.