Vlastný mapovač s MapStruct

1. Prehľad

V tomto článku sa dozvieme, ako používať vlastný mapovač s knižnicou MapStruct.

Knižnica MapStruct sa používa na mapovanie medzi typmi fazule Java. Použitím vlastného mapovača s MapStruct,môžeme prispôsobiť predvolené metódy mapovania.

2. Maven závislosti

Pridajme knižnicu máp do nášho Mavenu pom.xml:

 org.mapstruct mapstruct 1.3.1.Final 

Ak chcete vidieť automaticky generované metódy vo vnútri projektu cieľový priečinok, musíme pridať annotationProcessorPaths do maven-compiler-plugin zapojiť:

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

3. Vlastný mapovač

Na riešenie konkrétnych požiadaviek na prevod sa používajú vlastné mapovače. Aby sme to dosiahli, musíme definovať metódu uskutočnenia konverzie. Potom musíme o metóde informovať MapStruct. Nakoniec MapStruct zavolá metódu na vykonanie konverzie zo zdroja na cieľ.

Predstavme si napríklad, že máme aplikáciu, ktorá počíta správu s indexom telesnej hmotnosti (BMI) používateľa. Na výpočet BMI musíme zhromaždiť hodnoty tela používateľa. Na prevod imperiálnych jednotiek na metrické jednotky môžeme použiť vlastné metódy mapovača.

Existujú dva spôsoby použitia vlastného mapovača s MapStruct. Vlastnú metódu môžeme zavolať tak, že ju napíšeme do @Mapovanie anotácie QualifiedByName vlastnosť, alebo k nej môžeme vytvoriť anotáciu.

Než začneme, musíme definovať triedu DTO, ktorá bude obsahovať imperiálne hodnoty:

verejná trieda UserBodyImperialValuesDTO {private int inch; súkromná int libra; // konštruktor, getri a nastavovatelia}

Ďalej definujeme triedu DTO na uchovávanie metrických hodnôt:

public class UserBodyValues ​​{private double kilogram; súkromný dvojcentimeter; // konštruktor, getri a nastavovatelia}

3.1. Vlastný mapovač s metódou

Ak chcete začať používať vlastné mapovače, vytvorme si rozhranie s @Mapper anotácia:

@Mapper verejné rozhranie UserBodyValuesMapper {// ...}

Po druhé, vytvorme našu vlastnú metódu s požadovaným návratovým typom a argumentom, ktorý musíme previesť. Musíme použiť znak @Menovaný anotácia s parametrom hodnoty, ktorá informuje MapStruct o vlastnej metóde mapovača:

@Mapper verejné rozhranie UserBodyValuesMapper {@Named ("inchToCentimeter") verejný statický dvojitý inchToCentimeter (int palec) {návratný palec * 2,54; } // ...}

A nakoniec definujme metódu rozhrania mapovača pomocou @Mapovanie anotácia. V rámci tejto anotácie povieme MapStruct o type zdroja, cieľovom type a metóde, ktorú použije:

@Mapper verejné rozhranie UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @ Mapovanie (zdroj = "palec", cieľ = "centimeter", kvalifikovanéByName = "inchToCentimeter") verejné UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @Named ("inchToCentimeter") verejný statický dvojitý inchToCentimeter (int palec) {návratný palec * 2,54; }}

Vyskúšajme náš vlastný mapovač:

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

3.2. Vlastný mapovač s anotáciou

Ak chcete použiť vlastný mapovač s anotáciou, musíme namiesto. Definovať anotáciu @ Menovaný anotácia. Potom musíme informovať MapStruct o novovytvorenej anotácii zadaním @Mapovanie anotácie QualifiedByName parameter.

Pozrime sa, ako definujeme anotáciu:

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

Pridajme @PoundToKilogramMapper anotácia k našej poundToKilogram metóda:

@PoundToKilogramMapper public static double poundToKilogram (int libra) {návratová libra * 0,4535; } 

Teraz definujme metódu rozhrania mapovača pomocou @Mapovanie anotácia. V rámci anotácie mapovania povieme MapStruct o type zdroja, cieľovom type a triede anotácie, ktoré bude používať:

@Mapper verejné rozhranie UserBodyValuesMapper {UserBodyValuesMapper INSTANCE = Mappers.getMapper (UserBodyValuesMapper.class); @Mapping (zdroj = "libra", cieľ = "kilogram", kvalifikovanýBy = PoundToKilogramMapper.class) public UserBodyValues ​​userBodyValuesMapper (UserBodyImperialValuesDTO dto); @PoundToKilogramMapper public static double poundToKilogram (int libra) {návratová libra * 0,4535; }}

Nakoniec otestujme náš vlastný mapovač:

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

4. Záver

V tomto článku naučili sme sa, ako používať vlastný mapovač s knižnicou MapStruct.

Implementácie týchto príkladov a testov sú k dispozícii na serveri GitHub.


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