Prilagođeni Mapper s MapStructom

1. Pregled

U ovom ćemo članku naučiti kako koristiti prilagođeni mapper s knjižnicom MapStruct.

Biblioteka MapStruct koristi se za mapiranje između tipova Java graha. Korištenjem prilagođenog mappera s MapStructom,možemo prilagoditi zadane metode mapiranja.

2. Ovisnosti Mavena

Dodajmo knjižnicu mapstruct u naš Maven pom.xml:

 org.mapstruct mapstruct 1.3.1.Final 

Da biste vidjeli automatski generirane metode unutar projektnih ciljna mapa, moramo dodati annotationProcessorPaths prema maven-compiler-plugin uključiti:

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

3. Prilagođeni Mapper

Prilagođeni maperi koriste se za rješavanje specifičnih zahtjeva pretvorbe. Da bismo to postigli, moramo definirati metodu za pretvorbu. Zatim o metodi moramo obavijestiti MapStruct. Napokon, MapStruct će pozvati metodu za pretvorbu iz izvora u cilj.

Na primjer, zamislimo da imamo aplikaciju koja izračunava korisnikov izvještaj o indeksu tjelesne mase (BMI). Da bismo izračunali BMI, moramo prikupiti korisničke vrijednosti tijela. Da bismo pretvorili carske jedinice u metričke jedinice, možemo koristiti prilagođene metode mapiranja.

Postoje dva načina korištenja prilagođenog mappera s MapStructom. Prilagođenu metodu možemo pozvati upisivanjem u @ Mapiranje bilješke qualiByName svojstvo ili za njega možemo stvoriti napomenu.

Prije nego što započnemo, moramo definirati DTO klasu koja će imati carske vrijednosti:

javna klasa UserBodyImperialValuesDTO {private int inch; privatna int funta; // konstruktor, getteri i postavljači}

Dalje, definirajmo DTO klasu koja će sadržavati metričke vrijednosti:

javna klasa UserBodyValues ​​{privatni dvostruki kilogram; privatni dvostruki centimetar; // konstruktor, getteri i postavljači}

3.1. Prilagođeni Mapper s metodom

Da bismo počeli koristiti prilagođene mape, stvorimo sučelje s @Mapper napomena:

@Mapper javno sučelje UserBodyValuesMapper {// ...}

Drugo, kreirajmo svoju prilagođenu metodu s vrstom povratka koju želimo i argumentom koji moramo pretvoriti. Moramo koristiti @Imenovan napomena s parametrom vrijednosti za informiranje MapStructa o prilagođenoj metodi mapiranja:

@Mapper javno sučelje UserBodyValuesMapper {@Named ("inchToCentimeter") javni statički dvostruki inchToCentimeter (int inč) {return inch * 2,54; } // ...}

I na kraju, definirajmo metodu sučelja mapper s @ Mapiranje bilješka. Unutar ove bilješke reći ćemo MapStructu o izvornom tipu, ciljnom tipu i metodi koju će koristiti:

@Mapper javno sučelje UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (source = "inch", target = "centimetar", qualiByName = "inchToCentimeter") public UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @Named ("inchToCentimeter") javni statički dvostruki inchToCentimeter (int inč) {return inch * 2,54; }}

Isprobajmo naš prilagođeni mapper:

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

3.2. Prilagođeni Mapper s bilješkom

Da bismo koristili prilagođeni mapper s napomenom, moramo definirati napomenu umjesto @Name bilješka. Zatim moramo obavijestiti MapStruct o novostvorenoj bilješci tako što ćemo navesti @Mapiranje bilješke qualiByName parametar.

Pogledajmo kako definiramo napomenu:

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

Dodajmo i @PoundToKilogramMapper napomena za našu poundToKilogram metoda:

@PoundToKilogramMapper javni statički dvostruki poundToKilogram (int funta) {return funta * 0,4535; } 

Sada, definirajmo metodu sučelja mapper s @ Mapiranje bilješka. Unutar bilješke mapiranja reći ćemo MapStructu o izvornoj vrsti, ciljnoj vrsti i klasi bilješke koju će koristiti:

@Mapper javno sučelje UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (source = "pound", target = "kilogram", qualiBy = PoundToKilogramMapper.class) public UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @PoundToKilogramMapper javni statički dvostruki poundToKilogram (int funta) {return funta * 0,4535; }}

Na kraju, testirajmo svoj prilagođeni mapper:

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

4. Zaključak

U ovom članku, naučili smo kako koristiti prilagođeni mapper s knjižnicom MapStruct.

Implementacije ovih primjera i testova dostupne su na GitHubu.


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