Top Banner
Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH 1 Machst Du noch Reflection oder annotierst Du schon? Bean-Mapping mit MapStruct Thomas Much [email protected] www.muchsoft.com
44

Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Jun 14, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH 1

Machst Du noch Reflection oder annotierst Du schon?

Bean-Mapping mit MapStruct

Thomas Much

[email protected] www.muchsoft.com

Page 2: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

20 Jahre Java, 18 Jahre Beans

2

1995

2015

1997

JavaBeans

1998

FormBeans

1999

DTOs

2000

POJOs

2005

JAXB-Entities

2006

JPA-Entities

Typsicheres, schnelles

Bean- Mapping!

Page 3: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Alte Architekturen

3

Page 4: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Was Java EE 5+ und JPA versprechen

4

Page 5: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Die moderne Realität

5

Page 6: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Das erforderliche Mapping …

6

@Entity @Table(name = "KUNDEN") public class Kunde {

@Id Long id;

long kundennummer;

String name;

@Enumerated KundenArt kundenart;

… Getter und Setter! … }

public class KundeDTO {

long id;

String kundennummer;

String name;

String kundenart;

… Getter und Setter! … }

Page 7: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

… kann aufwendig werden

7

JPA- Entity

DTO

JAXB- Entity

REST- Entity

View- Bean

Page 8: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Mapping-Implementation – wie?

◼ Selbst programmiert ◼ alle Getter/Setter von Hand aufrufen

◼ eigene Reflection-Routinen

◼ Reflection-Bibliotheken: ◼ Apache BeanUtils

http://commons.apache.org/proper/commons-beanutils/

◼ Dozerhttp://dozer.sourceforge.net/

◼ Probleme: Aufwand, Typunsicherheit, Performance …

8

Page 9: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

MapStruct

◼ MapStruct: http://mapstruct.org/

◼ Annotations-Prozessor, der Mapping-Code generiert ◼ Keine Reflection! ◼ Typsicher und schnell

◼ Mind. Java 6, spezielle Unterstützung für Java 8 ◼ Minimale Laufzeitabhängigkeit (< 20 K) ◼ Je nach Komponentenmodell gar keine Abhängigkeit

9

Page 10: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Achtung, Beta!

10

http://de.wikipedia.org/wiki/Entwicklungsstadium_(Software)#Beta-Version

◼ Seit 2013 in Entwicklung ◼ Aktuelle Version 1.0.0.Beta4 ◼ Finale Version bald erwartet

Page 11: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Artefakte (Dependencies)

◼ http://mvnrepository.com/artifact/org.mapstruct

◼ http://sourceforge.net/projects/mapstruct/files/

11

Page 12: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Beispiel – JPA-Entity nach DTO

12

@Entity @Table(name = "KUNDEN") public class Kunde {

@Id Long id;

long kundennummer;

String name;

@Enumerated KundenArt kundenart;

… Getter und Setter! … }

public class KundeDTO {

long id;

String kundennummer;

String name;

String kundenart;

… Getter und Setter! … }

Alle public-Properties sollen gemappt werden (auch aus Oberklassen)

Page 13: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Beispiel – MapStruct minimal

import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers;

@Mapper public interface KundeMapper {

KundeMapper INSTANCE = Mappers.getMapper(KundeMapper.class);

KundeDTO kunde2KundeDto(Kunde kunde);

}

13

Live Demo

KundeDTO dto = KundeMapper.INSTANCE.kunde2KundeDto( kunde );

Page 14: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Beispiel – generierter Code

@Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2015-04-21T22:01:21+0200", comments = "version: 1.0.0.Beta4, compiler: Eclipse JDT (IDE) …")public class KundeMapperImpl implements KundeMapper {

@Override public KundeDTO kunde2KundeDto(Kunde kunde) { if ( kunde == null ) { return null; }

KundeDTO kundeDTO = new KundeDTO();

kundeDTO.setName( kunde.getName() ); kundeDTO.setKundennummer( String.valueOf( kunde.getKundennummer() ) ); if ( kunde.getKundenArt() != null ) { kundeDTO.setKundenArt( kunde.getKundenArt().toString() ); } if ( kunde.getId() != null ) { kundeDTO.setId( kunde.getId() ); }

return kundeDTO; }}

14

date- und comments-Attribute können

unterdrückt werden

Mapper sind Thread-sicher!

Page 15: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Typsicherheit

15

Page 16: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Meldungen für Target-Properties

16

Alternativ global per System-Property

konfigurieren

Page 17: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Mapper in Komponentenmodellen

17

@Generated( value = "org.mapstruct.ap.MappingProcessor", ) @ApplicationScoped public class KundeMapperImpl implements KundeMapper { … }

default cdi

spring jsr330

Page 18: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Updates – Beans ergänzen

18

@Mapper public interface KundeMapper {

void updateKundeFromDto( KundeDTO kundeDto, @MappingTarget Kunde kunde);

}

Max. ein Mapping-Target

Alternativ Target-Typ als Rückgabe

(für fluent-Aufrufe)

Page 19: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Objektgraphen mappen

19

@Mapper public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde);

AdresseDTO adresse2AdresseDto(Adresse adresse);

}

public class Kunde { …

Adresse adresse;

… Getter und Setter! … }

public class KundeDTO { …

AdressDTO adresse;

… Getter und Setter! … }

Page 20: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Unterschiedliche Property-Namen

20

@Mapper public interface KundeMapper {

@Mappings({ @Mapping(source="id", target="entityId"), @Mapping(source="name", target="kundenname")

}) KundeDTO kunde2KundeDto(Kunde kunde);

@Mapping(source="plz", target="postleitzahl") AdresseDTO adresse2AdresseDto(Adresse adresse);

}

Page 21: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Setter-Reihenfolge

21

@Mapper public interface KundeMapper {

@Mapping( target="kundennummer", dependsOn="kundenArt")

@Mapping( target="name", dependsOn={"vorname","nachname"})

KundeDTO kunde2KundeDto(Kunde kunde);

}

setKundennummer() wird nach setKundenArt()

aufgerufen

Keine zugesicherte Reihenfolge innerhalb

des Arrays

Page 22: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Autom. (implizite) Typumwandlung

Primitive Typen ⬌ Wrapper (inkl. null-Checks) int ⬌ Integer etc.

int/long/byte ⬌ Integer etc.

Primitive Typen & Wrapper ⬌ Stringint/Integer/Boolean ⬌ String etc.

enum ⬌ String

BigInteger/BigDecimal ⬌ Primitive/Wrapper/String

22

Page 23: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Autom. Typumwandlung (JAXB)

JAXBElement<T> ⬌ T

List<JAXBElement<T>> ⬌ List<T>

XMLGregorianCalendar ⬌ Date/Calendar

23

Page 24: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Autom. Typumwandlung (Datum+Zeit)

Date/Calendar/XMLGregorianCalendar ⬌ String / dateFormat

Joda ⬌ String / dateFormat

Joda ⬌ Date, Calendar

java.time ⬌ String / dateFormat

java.time ⬌ Date, Calendar

24

Page 25: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Autom. Typumwandlung (Datum+Zeit)

25

@Mapper public interface KundeMapper {

@Mapping(source="geburtsdatum", dateFormat="dd.MM.yyyy") KundeDTO kunde2KundeDto(Kunde kunde);

@IterableMapping(dateFormat="dd.MM.yyyy") List<String> dateList2StringList(List<Date> list);

}

Page 26: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Mehrere Quell-Objekte – Beans mixen

26

@Mapper public interface KundeMapper {

@Mappings({ @Mapping(target="empfaengerName", source="kunde.name"), @Mapping(target="postleitzahl", source="adresse.plz"), @Mapping(target="gewichtInKg", source="gewicht")

}) Lieferanschrift buildLieferanschrift( Kunde kunde, Adresse adresse, Integer gewicht);

}

Bel. Verschachtelungstiefe (null-Checks bei jedem Sprung)

Bel. viele Quell-Parameter

Page 27: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Arrays und Collections

27

@Mapper public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde);

List<KundeDTO> kunden2Dtos(List<Kunde> kunden);

KundeDTO[] kunden2Dtos(Kunde[] kunden);

KundeDTO[] kundenList2DtoArray(List<Kunde> kunden);

List<KundeDTO> kundenArray2DtoList(Kunde[] kunden);

Set<String> ints2Strings(Set<Integer> ints); }

CollectionMappingStrategy (Setter vs. Adder) konfigurierbar

Page 28: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Maps mappen

28

@Mapper public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde);

@MapMapping(valueDateFormat="dd.MM.yyyy") Map<String,String> mapKnrDatum(Map<Long,Date> map);

}

Ebenso keyDateFormat

Page 29: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

enum-Werte abbilden

29

@Mapper public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde);

@Mapping(target="EXPRESS", source="PREMIUM") @Mapping(target="EXPRESS", source="AKTION") @Mapping(target="STANDARD", source="NORMAL") DtoKundenArt kundenArt2DtoKundenArt(KundenArt art);

}

Page 30: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Eigener Mapping-Code (1)

30

@Mapper public abstract class KundeMapper {

@Mappings({ …

}) public abstract KundeDTO kunde2KundeDto(Kunde k);

public AdresseDTO adresse2AdresseDto(Adresse adr) { … eigener Mapping-Code …

}

}

Page 31: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Eigener Mapping-Code (2)

31

@Mapper(uses=AdresseMapper.class) public interface KundeMapper {

@Mappings({ …

}) KundeDTO kunde2KundeDto(Kunde kunde);

}

Eigene Mapping-Klasse muss dasselbe Komponentenmodell wie

der MapStruct-Mapper verwenden!

Page 32: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Bean-Fabriken

32

@Mapper(uses={DtoFactory.class, EntityFactory.class}) public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde); Kunde kundeDto2Kunde(KundeDTO dto); }

public class DtoFactory { public KundeDTO createKundeDTO() {

return new KundeDTO(); }

}

public class EntityFactory { public <T extends BaseEntity> T createEntity(@TargetType Class<T> entityClass) { return entityClass.newInstance();

} }

Page 33: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Exceptions beim Mapping

33

@Mapper(uses=SelbstgeschriebenerMapper.class) public interface KundeMapper {

Kunde dto2Kunde(KundeDTO dto) throws KundenArtException;

}

public class SelbstgeschriebenerMapper { public KundenArt long2KundenArt(Long zahl)

throws KundenArtException, SchwereException { …

} }

Nicht deklarierte Checked-Exceptions werden als RuntimeExceptions weiter

geworfen

Page 34: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Konstante Werte im Ziel setzen

34

@Mapper public interface KundeMapper {

@Mapping( target="stringAttribut", constant="mein String")

@Mapping( target="intAttribut", constant="23")

@Mapping( target="longWrapperAttribut", constant="12345678")

@Mapping( target = "dateAttribut", dateFormat = "dd.MM.yyyy", constant = "24.04.2015"

) KundeDTO kunde2KundeDto(Kunde kunde);

}

Page 35: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Berechnete Werte im Ziel setzen

35

@Mapper(imports=Date.class) public interface KundeMapper {

@Mapping( target="geburtsdatum", expression= "java( new Date(kunde.getGeburtsdatumMillis()) )"

) KundeDTO kunde2KundeDto(Kunde kunde);

}

Page 36: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Methoden per Qualifier auswählen (1)

36

@Mapper(uses=AnredeMapper.class) public interface KundeMapper {

KundeDTO kunde2KundeDto(Kunde kunde); }

public class AnredeMapper {

public String deutsch2Englisch(String anrede) { … } public String englisch2deutsch(String anrede) { … }

}

?

Page 37: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Methoden per Qualifier auswählen (2)

37

@Mapper public interface KundeMapper {

@Mapping(target="anrede", qualifiedBy={ AnredeUebersetzer.class,EnglischNachDeutsch.class

}) KundeDTO kunde2KundeDto(Kunde kunde); }

@AnredeUebersetzer public class AnredeMapper {

@DeutschNachEnglisch public String deutsch2Englisch(String anrede) { … }

@EnglischNachDeutsch public String englisch2deutsch(String anrede) { … }

}

Selbstgeschriebene @Qualifier-Annotationen

Page 38: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

null-Mapping anpassen

◼ Bei null-Wert wird standardmäßig null gesetzt.

◼ MitnullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULTwerden stattdessen Default-Werte gesetzt(für primitive Type, Listen etc.)

◼ Verfügbar bei @Mapper etc.

38

Page 39: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Mapping-Konfiguration "vererben"

39

@Mapper public interface KundeMapper {

@Mappings( …

) KundeDTO kunde2KundeDto(Kunde kunde);

@InheritConfiguration(name="kunde2KundeDto") @Mappings({ … }) void updateDtoFromKunde(

Kunde kunde, @MappingTarget KundeDTO dto);

}

Page 40: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Umgekehrte Mappings

40

@Mapper public interface KundeMapper {

@Mappings( …

) KundeDTO kunde2KundeDto(Kunde kunde);

@InheritInverseConfiguration Kunde kundeDto2Kunde(KundeDTO dto);

}

Page 41: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

@MapperConfig( mappingInheritanceStrategy= MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG

) public class MeineKonfiguration {

@Mappings({ … }) BasisDTO entity2Dto(BasisEntity entity);

}

Gemeinsam genutzte Konfigurationen

41

@Mapper(config=MeineKonfiguration.class) public interface KundeMapper {

@Mappings({ … }) KundeDTO kunde2KundeDto(Kunde kunde); }

Hier wird noch kein Mapping-Code generiert!

Page 42: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Ausblick – Eclipse-Plugin

◼ https://github.com/mapstruct/mapstruct-eclipse/ ◼ Frühes Entwicklungsstadium

42

Page 43: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

MapStruct – Fazit

◼ Trotz Beta schon produktiv einsetzbar! ◼ Zur Not wird der generierte Code eingecheckt

und später von Hand weiter gepflegt.

◼ Generierter Code ist einfach und lesbar.

◼ Flexible (Custom-)Mappings

◼ Einfache Einbindung in div. Komponentenmodelle

43

Page 44: Bean-Mapping mit MapStruct€¦ · Bean-Mapping mit MapStruct - Thomas Much 2Copyright © 2015 MATHEMA Software GmbH 20 Jahre Java, 18 Jahre Beans 1995 1997 2015 JavaBeans 1998 Form

Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH

Fragen?

Vielen Dank! 😃

[email protected]

www.muchsoft.com

www.javabarista.de

44