44
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

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

  • Upload
    others

  • View
    18

  • Download
    0

Embed Size (px)

Citation preview

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