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.