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.