Custom Mapper med MapStruct

1. Oversigt

I denne artikel lærer vi, hvordan du bruger tilpasset kortlægger med MapStruct-biblioteket.

MapStruct-biblioteket bruges til kortlægning mellem Java-bønnetyper. Ved at bruge en brugerdefineret kortlægger med MapStruct,vi kan tilpasse standardkortlægningsmetoderne.

2. Maven-afhængigheder

Lad os tilføje kortstrukturbiblioteket i vores Maven pom.xml:

 org.mapstruct mapstruct 1.3.1.Final 

For at se de automatisk genererede metoder inde i projektets målmappe, vi er nødt til at tilføje annotationProcessorPaths til maven-compiler-plugin plugin:

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

3. Custom Mapper

Custom mappers bruges til at løse specifikke konverteringskrav. For at opnå dette skal vi definere en metode til konvertering. Derefter skal vi underrette MapStruct om metoden. Endelig kalder MapStruct metoden til at udføre konverteringen fra kilde til mål.

Lad os for eksempel forestille os, at vi har en app, der beregner brugerens body mass index (BMI) rapport. For at beregne BMI skal vi indsamle brugerens kropsværdier. For at konvertere kejserlige enheder til metriske enheder kan vi bruge de tilpassede kortlægningsmetoder.

Der er to måder at bruge en brugerdefineret kortlægger med MapStruct på. Vi kan enten kalde den brugerdefinerede metode ved at skrive den inde i @Kortlægning annoteringer kvalificeretBynavn ejendom, eller vi kan oprette en kommentar til den.

Før vi starter, er vi nødt til at definere en DTO-klasse, der skal indeholde kejserlige værdier:

offentlig klasse UserBodyImperialValuesDTO {private int inch; privat int pund; // konstruktør, getters og setter}

Lad os derefter definere en DTO-klasse, der skal indeholde metriske værdier:

offentlig klasse UserBodyValues ​​{privat dobbelt kilogram; privat dobbelt centimeter; // konstruktør, getters og setter}

3.1. Custom Mapper med metode

For at begynde at bruge brugerdefinerede kortlæggere, lad os oprette en grænseflade med @Mapper kommentar:

@Mapper offentlig grænseflade UserBodyValuesMapper {// ...}

For det andet, lad os oprette vores brugerdefinerede metode med den returretype, vi ønsker, og det argument, vi har brug for at konvertere. Vi er nødt til at bruge @Som hedder kommentar med parameteren værdi for at informere MapStruct om den tilpassede kortlægningsmetode:

@Mapper offentlig grænseflade UserBodyValuesMapper {@Named ("inchToCentimeter") offentlig statisk dobbelt inchToCentimeter (int tomme) {return inch * 2,54; } // ...}

Og endelig, lad os definere mapper-interface-metoden med @Kortlægning kommentar. Inden for denne kommentar fortæller vi MapStruct om kildetypen, måltypen og den metode, den vil bruge:

@Mapper offentlig grænseflade UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (kilde = "tomme", target = "centimeter", kvalificeretByName = "inchToCentimeter") offentlig UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @Named ("inchToCentimeter") offentlig statisk dobbelt inchToCentimeter (int inch) {retur inch * 2,54; }}

Lad os teste vores brugerdefinerede kortlægger:

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

3.2. Custom Mapper med en kommentar

For at bruge en brugerdefineret kortlægger med en kommentar skal vi definere en kommentar i stedet for @Som hedder kommentar. Derefter skal vi informere MapStruct om den nyoprettede kommentar ved at specificere @Kortlægning annoteringer kvalificeretBynavn parameter.

Lad os se, hvordan vi definerer kommentaren:

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

Lad os tilføje @PoundToKilogramMapper kommentar til vores pundToKilogram metode:

@PoundToKilogramMapper offentlig statisk dobbelt pundToKilogram (int pund) {retur pund * 0,4535; } 

Lad os nu definere kortlægningsgrænseflademetoden med @Kortlægning kommentar. Inden for kortlægningsannotationen fortæller vi MapStruct om kildetypen, måltypen og kommentarklassen, som den vil bruge:

@Mapper offentlig grænseflade UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (kilde = "pund", mål = "kilogram", kvalificeretBy = PoundToKilogramMapper.class) offentlig UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @PoundToKilogramMapper offentlig statisk dobbelt pundToKilogram (int pund) {retur pund * 0,4535; }}

Lad os endelig teste vores brugerdefinerede kortlægger:

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

4. Konklusion

I denne artikel vi lærte at bruge en brugerdefineret kortlægger med MapStruct-biblioteket.

Implementeringerne af disse eksempler og tests er tilgængelige på GitHub.


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