Tilpasset kartlegger med MapStruct

1. Oversikt

I denne artikkelen lærer vi hvordan du bruker tilpasset kartlegger med MapStruct-biblioteket.

MapStruct-biblioteket brukes til kartlegging mellom Java-bønnetyper. Ved å bruke en tilpasset kartlegger med MapStruct,vi kan tilpasse standard kartleggingsmetoder.

2. Maven-avhengigheter

La oss legge til kartstrukturbiblioteket i Maven pom.xml:

 org.mapstruct mapstruct 1.3.1.Final 

For å se de automatisk genererte metodene inne i prosjektet målmappe, må vi legge til annotationProcessorPaths til maven-compiler-plugin plugg inn:

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

3. Tilpasset kartlegger

Tilpassede kartleggere brukes til å løse spesifikke konverteringskrav. For å oppnå dette må vi definere en metode for å gjøre konverteringen. Deretter må vi varsle MapStruct om metoden. Til slutt vil MapStruct kalle metoden for å gjøre konverteringen fra kilde til mål.

La oss for eksempel forestille oss at vi har en app som beregner brukerens body mass index (BMI) rapport. For å beregne BMI, må vi samle inn brukerens kroppsverdier. For å konvertere keiserlige enheter til metriske enheter, kan vi bruke de tilpassede kartleggingsmetodene.

Det er to måter å bruke en tilpasset kartlegger med MapStruct på. Vi kan enten ringe den tilpassede metoden ved å skrive den inne i @Kartlegging merknader kvalifisertByName eiendom, eller vi kan lage en kommentar for den.

Før vi begynner, må vi definere en DTO-klasse for å ha keiserlige verdier:

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

Deretter la oss definere en DTO-klasse for å inneholde beregningsverdier:

offentlig klasse UserBodyValues ​​{privat dobbelt kilo; privat dobbel centimeter; // konstruktør, getters og setters}

3.1. Tilpasset kartlegger med metode

For å begynne å bruke tilpassede kartleggere, la oss lage et grensesnitt med @Kartlegger kommentar:

@Mapper offentlig grensesnitt UserBodyValuesMapper {// ...}

For det andre, la oss lage vår tilpassede metode med returtypen vi ønsker og argumentet vi trenger å konvertere. Vi må bruke @Navngitt kommentar med verdiparameteren for å informere MapStruct om den tilpassede kartleggingsmetoden:

@Mapper offentlig grensesnitt UserBodyValuesMapper {@Named ("inchToCentimeter") offentlig statisk dobbel inchToCentimeter (int tomme) {retur tomme * 2,54; } // ...}

Og til slutt, la oss definere kartleggergrensesnittmetoden med @Kartlegging kommentar. Innenfor denne kommentaren vil vi fortelle MapStruct om kildetypen, måltypen og metoden den vil bruke:

@Mapper offentlig grensesnitt UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (kilde = "tomme", mål = "centimeter", kvalifisertBynavn = "tommeToCentimeter") offentlig UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @Named ("inchToCentimeter") offentlig statisk dobbel inchToCentimeter (int tomme) {retur tomme * 2,54; }}

La oss teste vår tilpassede kartlegger:

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

3.2. Tilpasset kartlegger med en kommentar

For å bruke en tilpasset kartlegger med en kommentar, må vi definere en kommentar i stedet for @Named kommentar. Deretter må vi informere MapStruct om den nyopprettede kommentaren ved å spesifisere @Kartlegging merknader kvalifisertByName parameter.

La oss se hvordan vi definerer kommentaren:

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

La oss legge til @PoundToKilogramMapper kommentar til vår pundToKilogram metode:

@PoundToKilogramMapper offentlig statisk dobbeltpundToKilogram (int pund) {returpund * 0,4535; } 

La oss nå definere kartleggergrensesnittmetoden med @Kartlegging kommentar. Innenfor kartleggingsnotatet vil vi fortelle MapStruct om kildetypen, måltypen og merkeklassen som den vil bruke:

@Mapper offentlig grensesnitt UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (kilde = "pund", mål = "kilogram", kvalifisertBy = PoundToKilogramMapper.class) offentlig UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @PoundToKilogramMapper offentlig statisk dobbeltpundToKilogram (int pund) {returpund * 0,4535; }}

Til slutt, la oss teste vår tilpassede kartlegger:

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

4. Konklusjon

I denne artikkelen, vi lærte hvordan vi bruker en tilpasset kartlegger med MapStruct-biblioteket.

Implementeringene av disse eksemplene og testene er tilgjengelige på GitHub.


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