[JAVA] Bean-Mapping mit MapStruct Teil 3

Fortsetzung des letzten Males

http://qiita.com/kentama/items/09a8573bd5d0831b470e http://qiita.com/kentama/items/55c71ca28f0c5af8d4ed

Typkonvertierung und Formatierung

Die Typkonvertierung kann zum Zeitpunkt der Zuordnung wie int-> String durchgeführt werden. Zu diesem Zeitpunkt kann auch das Format angegeben werden.

Bean


public class Hoge {
    private String date;
    private String number;

   // constructor/getter/setter
}

public class Fuga {
    private LocalDate date;
    private int number;

   // constructor/getter/setter
}

Erstellen eines Mappers

@Mapper
public interface ConversionMapper {
    ConversionMapper INSTANCE = Mappers.getMapper(ConversionMapper.class);

    @Mapping(target = "date", source = "date", dateFormat = "JJJJ Jahr MM Monat TT Tag") // (1)
    @Mapping(target = "number", source = "number", numberFormat = "#,###") // (2)
    Hoge convert(Fuga fuga);
}

(1) Geben Sie das Datumsformat im Attribut dateFormat an. (2) Geben Sie das numerische Format im Attribut numberFormat an.

Lauf

Fuga fuga = new Fuga(LocalDate.of(2017, 4, 1), 1234567890);
Hoge hoge = ConversionMapper.INSTANCE.convert(fuga);

System.out.println(hoge.getDate()); //01. April 2017
System.out.println(hoge.getNumber()); // 1,234,567,890

Listentypkonvertierung

Sie können eine Liste auch mit @ IterableMapping typkonvertieren. Dieses Mal wird int-> String konvertiert und 3 Ziffern werden mit Nullen aufgefüllt.

Erstellen eines Mappers

@Mapper
public interface ConversionMapper {
    ConversionMapper INSTANCE = Mappers.getMapper(ConversionMapper.class);

    @IterableMapping(numberFormat = "000")
    List<String> zeroPadding(List<Integer> numbers);
}

Lauf

List<String> numbers = ConversionMapper.INSTANCE.zeroPadding(Arrays.asList(1, 2, 56, 76, 863));
System.out.println(numbers); // [001, 002, 056, 076, 863]

Wiederverwendung von Mapper

Sie können andere Mapper von Mapper verwenden. Sie können einen von MapStruct generierten Mapper oder einen unabhängig implementierten Mapper angeben.

Bean


public class Hoge {
    private String date;

    // constructor/getter/setter
}

public class Fuga {
    private LocalDate date;

    // constructor/getter/setter
}

Erstellen eines Mappers

Erstellen Sie dieses Mal Ihren eigenen Mapper für LocalDate-> String-Konvertierung und verwenden Sie ihn erneut.

Original Mapper


public class LocalDateMapper {
    public String asString(LocalDate date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("JJJJ Jahr MM Monat TT Tag");
        return date != null ? date.format(formatter) : null;
    }
}
@Mapper(uses = LocalDateMapper.class) // (1)
public interface InvokingOtherMapper {
    InvokingOtherMapper INSTANCE = Mappers.getMapper(InvokingOtherMapper.class);

    Hoge fugaToHoge(Fuga fuga);
}

(1) Geben Sie den Mapper an, der im Attribut "using" wiederverwendet werden soll.

Lauf

Fuga fuga = new Fuga(LocalDate.of(2017, 4, 1));
Hoge hoge = InvokingOtherMapper.INSTANCE.fugaToHoge(fuga);

System.out.println(hoge.getDate()); //01. April 2017

Verwendung des Qualifiers

Sie können Ihrer eigenen Zuordnungslogik eine Anmerkung hinzufügen, damit Mapper Ihre eigene Zuordnungslogik verwenden kann. Hier wird als Beispiel eine Zuordnung zum Konvertieren in Groß- und Kleinbuchstaben durchgeführt.

Bean


public class Hoge {
    private String hoge1;
    private String hoge2;

    // constructor/getter/setter
}

public class Fuga {
    public String fuga1;
    public String fuga2;

    // constructor/getter/setter
}

Mapping-Logik erstellen

public class Characters {

    public String upperCase(String string) {
        return (string == null) ? null : string.toUpperCase();
    }

    public String lowerCase(String string) {
        return (string == null) ? null : string.toLowerCase();
    }
}

Annotation erstellen

@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface CharacterConverter {
}

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

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

Anmerkung

Fügen Sie die erstellte Anmerkung zur Zuordnungslogik hinzu.

@CharacterConverter
public class Characters {

    @ToUpper
    public String upperCase(String string) {
        return (string == null) ? null : string.toUpperCase();
    }

    @ToLower
    public String lowerCase(String string) {
        return (string == null) ? null : string.toLowerCase();
    }
}

Erstellen eines Mappers

@Mapper(uses = Characters.class) // (1)
public interface HogeFugaMapper {
    HogeFugaMapper INSTANCE = Mappers.getMapper(HogeFugaMapper.class);

    @Mapping(target = "hoge1", source = "fuga1", qualifiedBy = { CharacterConverter.class, ToUpper.class }) // (2)
    @Mapping(target = "hoge2", source = "fuga2", qualifiedBy = { CharacterConverter.class, ToLower.class }) // (3)
    Hoge fugaToHoge(Fuga fuga);
}

(1) Geben Sie die Zuordnungslogikklasse an (2) (3) Geben Sie die Klassenebene der Zuordnungslogikklasse und die Annotation an, die auf Methodenebene im Attribut qualifiziertBy angegeben ist.

Lauf

Fuga fuga = new Fuga("abc", "XYZ");
Hoge hoge = HogeFugaMapper.INSTANCE.fugaToHoge(fuga);

System.out.println(hoge.getHoge1()); // ABC
System.out.println(hoge.getHoge2()); // xyz

Nächstes Mal.

Recommended Posts

Bean-Mapping mit MapStruct Teil 3
Bean-Mapping mit MapStruct Teil 2
Führen Sie das Bean-Mapping mit MapStruct mit hoher Geschwindigkeit durch
Bean-Kopie mit MapStruct
Verwenden Sie die schnelle Mapping-Bibliothek MapStruct mit Lombok und Java 11
Java mit Ramen lernen [Teil 1]
REST-API-Test mit REST Assured Part 2
Bean-Mapping nützlich in Java ModelMapper
Bean Validation mit Micronaut (Java) hinzufügen
Einfache Eingabeprüfung mit Bean Validation!
Serververarbeitung mit Java (Einführung Teil.1)
Wiedereinführung in Betreiber mit RxJava Teil 1