bean-mapping mit mapstruct€¦ · bean-mapping mit mapstruct - thomas much 2copyright © 2015...
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/1.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/29.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/32.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/35.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/37.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/42.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022060219/5f06c6c97e708231d419adc5/html5/thumbnails/44.jpg)
Bean-Mapping mit MapStruct - Thomas Much Copyright © 2015 MATHEMA Software GmbH
Fragen?
Vielen Dank! 😃
www.muchsoft.com
www.javabarista.de
44