Custom Mapper met MapStruct

1. Overzicht

In dit artikel leren we hoe u een aangepaste mapper kunt gebruiken met de MapStruct-bibliotheek.

De MapStruct-bibliotheek wordt gebruikt voor het in kaart brengen tussen Java-bean-typen. Door een aangepaste mapper te gebruiken met MapStruct,we kunnen de standaard toewijzingsmethoden aanpassen.

2. Maven afhankelijkheden

Laten we de mapstruct-bibliotheek toevoegen aan onze Maven pom.xml:

 org.mapstruct mapstruct 1.3.1.Final 

Om de automatisch gegenereerde methoden in de Doelmap, we moeten de annotationProcessorPaths naar de maven-compiler-plugin inpluggen:

 org.apache.maven.plugins maven-compiler-plugin 3.5.1 1.8 1.8 org.mapstruct mapstruct 1.3.1.Final 

3. Aangepaste kaartenmaker

Aangepaste mappers worden gebruikt om specifieke conversievereisten op te lossen. Om dit te bereiken, moeten we een methode definiëren om de conversie uit te voeren. Vervolgens moeten we MapStruct op de hoogte stellen van de methode. Ten slotte zal MapStruct de methode aanroepen om de conversie van bron naar doel uit te voeren.

Laten we ons bijvoorbeeld voorstellen dat we een app hebben die het body mass index (BMI) -rapport van de gebruiker berekent. Om de BMI te berekenen, moeten we de lichaamswaarden van de gebruiker verzamelen. Om Engelse eenheden om te zetten in metrische eenheden, kunnen we de aangepaste mapper-methoden gebruiken.

Er zijn twee manieren om een ​​aangepaste mapper te gebruiken met MapStruct. We kunnen de aangepaste methode aanroepen door deze in het @In kaart brengen annotaties gekwalificeerdeByName eigenschap, of we kunnen er een annotatie voor maken.

Voordat we beginnen, moeten we een DTO-klasse definiëren om imperiale waarden vast te houden:

openbare klasse UserBodyImperialValuesDTO {privé int inch; privé int pond; // constructor, getters en setters}

Laten we vervolgens een DTO-klasse definiëren om metrische waarden te bevatten:

openbare klasse UserBodyValues ​​{privé dubbele kilogram; privé dubbele centimeter; // constructor, getters en setters}

3.1. Aangepaste kaartenmaker met methode

Laten we, om aangepaste mappers te gaan gebruiken, een interface maken met de @Mapper annotatie:

@Mapper openbare interface UserBodyValuesMapper {// ...}

Ten tweede, laten we onze aangepaste methode maken met het gewenste retourtype en het argument dat we moeten converteren. We moeten de @ gebruikenGenaamd annotatie met de parameter value om MapStruct te informeren over de aangepaste mapper-methode:

@Mapper openbare interface UserBodyValuesMapper {@Named ("inchToCentimeter") openbare statische dubbele inchToCentimeter (int inch) {return inch * 2.54; } // ...}

En laten we tot slot de mapper-interfacemethode definiëren met de @In kaart brengen annotatie. Binnen deze annotatie vertellen we MapStruct over het brontype, het doeltype en de methode die het zal gebruiken:

@Mapper openbare interface UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (source = "inch", target = "centimeter", gekwalificeerdByName = "inchToCentimeter") openbare UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @Named ("inchToCentimeter") openbare statische dubbele inchToCentimeter (int inch) {return inch * 2.54; }}

Laten we onze aangepaste mapper testen:

UserBodyImperialValuesDTO dto = nieuwe UserBodyImperialValuesDTO (); dto.setInch (10); UserBodyValues ​​obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper (dto); assertNotNull (obj); assertEquals (25.4, obj.getCentimeter (), 0); 

3.2. Custom Mapper met een annotatie

Om een ​​aangepaste mapper met een annotatie te gebruiken, moeten we een annotatie definiëren in plaats van de @Genaamd annotatie. Vervolgens moeten we MapStruct informeren over de nieuw gemaakte annotatie door de @ op te gevenIn kaart brengen annotaties gekwalificeerdeByName parameter.

Laten we eens kijken hoe we de annotatie definiëren:

@Qualifier @Target (ElementType.METHOD) @Retention (RetentionPolicy.CLASS) openbaar @interface PoundToKilogramMapper {}

Laten we de @BuienRadarNL annotatie bij onze pondToKilogram methode:

@PoundToKilogramMapper openbare statische dubbele poundToKilogram (int pond) {retour pond * 0,4535; } 

Laten we nu de mapper-interfacemethode definiëren met de @In kaart brengen annotatie. Binnen de toewijzingsannotatie vertellen we MapStruct over het brontype, het doeltype en de annotatieklasse die het zal gebruiken:

@Mapper openbare interface UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (source = "pond", target = "kilogram", qualBy = PoundToKilogramMapper.class) openbare UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @PoundToKilogramMapper openbare statische dubbele poundToKilogram (int pond) {retour pond * 0,4535; }}

Laten we tot slot onze aangepaste mapper testen:

UserBodyImperialValuesDTO dto = nieuwe UserBodyImperialValuesDTO (); dto.setPound (100); UserBodyValues ​​obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper (dto); assertNotNull (obj); assertEquals (45.35, obj.getKilogram (), 0); 

4. Conclusie

In dit artikel, we hebben geleerd hoe we een aangepaste mapper kunnen gebruiken met de MapStruct-bibliotheek.

De implementaties van deze voorbeelden en tests zijn beschikbaar op GitHub.