SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
WER ERZÄHLT DIE NÄCHSTEN 55+ MINUTEN
ETWAS?
Gerrit Brehmer, Karlsruhe
Auf der Arbeit: Software-Entwickler/Architekt ( / Projektleiter) bei der
inovex GmbH
In der Freizeit: Smart Home
BEAN-MAPPING: EINSATZ
Wann müssen Beans gemappt werden?
Entities zu DTOs
interne zu generierten Klassen (JAXB etc.)
zur Einbindung externer Dienste
standardisierten Schnittstellen
eigenen REST/SOAP Schnittstellen
Allgemein Austauschformate zwischen Schichten und Applikationen
BEAN MAPPING: UMSETZUNG
Was benutzen wir dafür bisher?
von Hand geschriebener Mapping-Code
typsicher, schnell
fehleranfällig, aufwendig
Dozer
wenig Aufwand, Rekursives Auto-Mapping
Reflection & XML: langsam
Apache Commons BeanUtils
wenig Aufwand
Reflection, nur nicht komplexe Properties, langsam
GEHT ES BESSER?
Wunschliste
schnell
typsicher
wenig Aufwand
automatisches Mapping
Null-Prüfungen
Konvertierungen von "ähnlichen" Typen
Fehlendes Mapping schnell erkennen
nachvollziehbar
MAPSTRUCT
mapstruct.org / github.com/mapstruct
OpenSource (Lizenz: Apache 2.0)
Initator & Maintainer: Gunnar Morling (RedHat,
Hibernate Team)
Aktuelle Version: 1.0.0.CR2 (Final Release in Kürze)
Weiterentwicklung/Support
mehrere Stamm-Entwickler
schnelles Feedback
kontinuierliche Weiterentwicklung
WIE FUNKTIONIERT MAPSTRUCT
Annotation Processor
Verarbeitet Annotations am eigenen Quellcode
siehe andere bekannte Libs: JPA MetaModel, Lombok, QueryDSL
z.B. mit Hilfe maven-processor-plugin
Generiert Java Quellcode
Zusammenspiel verschiedener FreeMarker Templates
DEMO
INTEGRATION IN ECLIPSE #1
MapStruct eclipse Plugin
noch work-in-progress
Hauptsächlich noch fehlende Features, keine Bugs
Code Completion: JAXB Listen, Nested Properties
Quick Fix: Collection Mappings
INTEGRATION IN ECLIPSE #2
m2e APT Plugin
Aktivierung nicht
vergessen!
Inkompatibilitäten mit
Eclipse Compiler pre Mars
(ab 1.0.0.CR2)
Manchmal 'Clean Project'
notwendig
Maven: build-helper-
maven-plugin
automatische Build-Path
Anpassung
GENERIERTE ABHÄNGIGKEITEN
Zu mappende Klassen sind ebenfalls generiert (z.B. JAXB per Schema)
Resultat: Compiler Fehler bei Generierung MapStruct Mapper
Lösung:
Weiteres Maven Modul/Artefakt für abhängige Klassen
Maven Plugins in unterschiedliche Phasen verlegen
AUTOMAPPING #1
Primitive & Wrapper-Typen
Datums-Typen
Joda / Java 8 DateTime API Klassen
Date
Calendar
dest.setLocalDateTime(java.time.LocalDateTime.ofInstant(
src.getDate().toInstant(),
java.time.ZoneId.systemDefault())
);
AUTOMAPPING #2
Collection- & Array-Typen
Mapping nicht nur per Setter
Adder (ohne Null Prüfung!)
Getter (ohne Null Prüfung!)
Setter
Mapping-Methoden zwischen Collection/Array Typen müssen nicht
definiert werden
Maps
JAXB
JAXBElement
XMLGregorianCalendar
VERSCHACHTELTE MAPPINGS
@Mapping(source = "source.nested.param" target = "param")
public Target toTarget(Source source);
inkl. Null-Prüfungen
Bisher nur für Quell-Parameter
Feature Request für Ziel-Parameter vorhanden
MAPPING VON ENUM-TYPEN
@Mapping(source = "FINAL", target = "LAST")
TargetEnum map(SourceEnum enum);
String-Match oder explizites Mapping
fehlende Mappings zu Zielwerten werden signalisiert
MAPPING DEFAULTS UND KONSTANTEN
@Mapping(source = "src", target = "dest", defaultValue = "-1")
Default-Werte als Ersatz bei null-Werten in Quell-
Instanzen
@Mapping(constant = "CONST", target = "dest")
String-Konstanten, auf die bei Bedarf Standard-
Converter oder andere Mapping Methoden
angewendet werden
QUALIFIER
Unterscheidung bei identischem Quell- und Zieltyp
Ohne Qualifier Zuordnung nicht eindeutig = Compiler Fehler
spezielle Mappings für ansonsten automatisch generierten Mapping-
Code
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Marker {
}
@Marker
public String specialStringMapping(String source) {
...
}
@Mapping(source = "src", target = "dest", qualifiedBy = Marker.class)
public Target map(Source source);
BEAN-FACTORIES
Als Ersatz für Standard-Konstruktor
Selbst geschriebene Factory-Methoden (leere Parameterliste,
Rückgabetyp = Zieltyp)
Generische Factories möglich
Verwendung bereits vorhandener (z.B. ObjectFactory von JAXB)
@Mapper(uses = CustomFactory.class)
public interface Mapper {
...
}
public class CustomFactory {
public TargetDto createTargetDto() {
....
}
public <T extends AbstractEntity> T createEntity(@TargetType Class<T> entityClass) {
...
}
}
MAPPING PER EXPRESSION
@Mapping(
expression = "java(java.util.UUID.randomUUID().toString())",
target = "uniqueId")
TargetDto mapTo(SourceEntity source);
Aktuell nur Unterstützung für Java Code
echte Skriptsprachen für zukünftige Versionen geplant
Notwendige Imports können am @Mapper konfiguriert werden
UNTERSCHIEDLICHE QUELLEN
@Mappings({
@Mapping(source = "param1.src", target = "dest1"),
@Mapping(source = "param2.src", target = "dest2")
})
Target map(SourceOne param1, SourceTwo param2);
Aber: Sind nur im Custom-Code / Expressions wiedervendbar
MAPPING ALS UPDATE
@Mapper
public interface Mapper {
Target update(Source src, @MappingTarget Target target);
}
mehrere Quellen möglich
Return Type: voidoder identisch mit Ziel-Typ
BIDIREKTIONALES MAPPING
@Mapper
public interface Mapper {
@Mapping(source = "special", target = "destParam")
Dto map(Entity source);
@InheritInverseConfiguration
Entity map(Dto source);
}
Ausnahmen
geschachtelte Quell-Property
Konstanten
Expressions
CUSTOM MAPPER #1
@Mapper(uses = CustomMapper.class)
public interface Mapper {
...
}
public class CustomMapper {
public TargetDto toTarget(Source source) {
....
}
}
Mapper Klassen
notwendig, wenn automatische Mapping-Methoden nicht
generiert werden können
Einzelnes Element gemappt auf Liste
Liste mit Inhalten aus verschiedenen Quellen
Liste komplexer Elemente gemappt auf Liste primitiver
Werte
CUSTOM MAPPER #2
@Mapper(uses = CustomMapper.class)
public interface Mapper {
...
}
@Mapper
public abstract class CustomMapper {
public TargetDto toTarget(Source source) {
....
}
@Mappings(...)
public abstract NestingTargetDto toNestingTarget(NestingSource source);
}
Abstrakte Klassen
Ähnlich wie Mapper per Interface
abstrakte Methoden werden generiert
public Methoden enthalten den nicht generierbaren Mapper-Code
KOMPONENTENMODELLE
Konfiguration pro Mapper
Mehrere werden bereits unterstützt
Spring (@Component, @Autowired)
CDI (@ApplicationScoped, @Inject)
JSR 330 (@Named, @Inject)
Alle miteinander verbundenen Mapper müssen dasselbe
Komponentenmodell verwenden
Keine Abhängigkeit zu MapStruct zur Laufzeit
@Mapper(componentModel = "spring")
public interface Mapper {
...
}
@Component
public class MapperImpl {
...
}
KONFIGURATION
@MapperConfig(componentModel = ..., uses = ..., ...)
public interface DefaultMapperConfig {
...
}
@Mapper(config = "DefaultMapperConfig")
public interface Mapper {
...
}
MAPPING ASPEKTE #1
Decorator
angepasster Code für ausgewählte Methoden
Aber: greift nur, wenn Methode vom eigenen Code oder anderen
Mapper-Klassen aufgerufen wird
@Mapper
@DecoratedWith(MapperDecorator.class)
public interface Mapper {
...
}
public abstract class MapperDecorator implements Mapper {
private final Mapper delegate;
public MapperDecorator(Mapper delegate) {
this.delegate = delegate;
}
@Override
public Target toTarget(Source source) {
Target target = delegate.toTarget(source);
// ... custom mapping
...
}
MAPPING ASPEKTE #2
@BeforeMappingund @AfterMapping
Matching auf Mapping-Methoden anhand Quell- und Zieltypen
@Mapper
public abstract class Mapper {
@BeforeMapping
void flushEntity(AbstractEntity entity) {
// flush entity to init all fields
}
@AfterMapping
void manuelUpdateMissing(Source src, @MappingTarget Target target) {
// e.g. as alternative for expressions / custom mapper
}
}
EXCEPTIONHANDLING
Checked Exceptions
nur wenn an Mapping Methode deklariert
ansonsten gewrapped in RuntimeException
RuntimeExceptions ohne Anpassung
FAZIT & AUSBLICK
MapStruct ist ready-to-use
umfangreiche Dokumentation
lebendige Community
keine Bugs, die den Einsatz verhndern
Große Funktionsauswahl: Viele Wege führen zum Ziel!
So viel wie möglich automatisch mappen
Damit verbundene Checks durch MapStruct minimieren Mapping
Fehler
Das Feature-Set ist noch nicht komplett: Weitere nützliche Features
werden sicher folgen!
VIELEN DANK FÜR EURE AUFMERKSAMKEIT!

Contenu connexe

Similaire à MapStruct - der neue Stern am Bean-Mapping Himmel?!

Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBMario Müller
 
Formale Methoden im Reverse Engineering
Formale Methoden im Reverse EngineeringFormale Methoden im Reverse Engineering
Formale Methoden im Reverse Engineeringzynamics GmbH
 
Dissertationsverteidigung "Autonome Topic Maps"
Dissertationsverteidigung "Autonome Topic Maps"Dissertationsverteidigung "Autonome Topic Maps"
Dissertationsverteidigung "Autonome Topic Maps"Lutz Maicher
 
dpsg Webmaster Convention 2010 - GMaps API
dpsg Webmaster Convention 2010 - GMaps APIdpsg Webmaster Convention 2010 - GMaps API
dpsg Webmaster Convention 2010 - GMaps APIOskar Kurz
 

Similaire à MapStruct - der neue Stern am Bean-Mapping Himmel?! (6)

Php Schulung
Php SchulungPhp Schulung
Php Schulung
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
 
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
 
Formale Methoden im Reverse Engineering
Formale Methoden im Reverse EngineeringFormale Methoden im Reverse Engineering
Formale Methoden im Reverse Engineering
 
Dissertationsverteidigung "Autonome Topic Maps"
Dissertationsverteidigung "Autonome Topic Maps"Dissertationsverteidigung "Autonome Topic Maps"
Dissertationsverteidigung "Autonome Topic Maps"
 
dpsg Webmaster Convention 2010 - GMaps API
dpsg Webmaster Convention 2010 - GMaps APIdpsg Webmaster Convention 2010 - GMaps API
dpsg Webmaster Convention 2010 - GMaps API
 

Plus de inovex GmbH

lldb – Debugger auf Abwegen
lldb – Debugger auf Abwegenlldb – Debugger auf Abwegen
lldb – Debugger auf Abwegeninovex GmbH
 
Are you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIAre you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIinovex GmbH
 
Why natural language is next step in the AI evolution
Why natural language is next step in the AI evolutionWhy natural language is next step in the AI evolution
Why natural language is next step in the AI evolutioninovex GmbH
 
Network Policies
Network PoliciesNetwork Policies
Network Policiesinovex GmbH
 
Interpretable Machine Learning
Interpretable Machine LearningInterpretable Machine Learning
Interpretable Machine Learninginovex GmbH
 
Jenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen UmgebungenJenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen Umgebungeninovex GmbH
 
AI auf Edge-Geraeten
AI auf Edge-GeraetenAI auf Edge-Geraeten
AI auf Edge-Geraeteninovex GmbH
 
Prometheus on Kubernetes
Prometheus on KubernetesPrometheus on Kubernetes
Prometheus on Kubernetesinovex GmbH
 
Deep Learning for Recommender Systems
Deep Learning for Recommender SystemsDeep Learning for Recommender Systems
Deep Learning for Recommender Systemsinovex GmbH
 
Representation Learning von Zeitreihen
Representation Learning von ZeitreihenRepresentation Learning von Zeitreihen
Representation Learning von Zeitreiheninovex GmbH
 
Talk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale AssistentenTalk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale Assistenteninovex GmbH
 
Künstlich intelligent?
Künstlich intelligent?Künstlich intelligent?
Künstlich intelligent?inovex GmbH
 
Das Android Open Source Project
Das Android Open Source ProjectDas Android Open Source Project
Das Android Open Source Projectinovex GmbH
 
Machine Learning Interpretability
Machine Learning InterpretabilityMachine Learning Interpretability
Machine Learning Interpretabilityinovex GmbH
 
Performance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use casePerformance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use caseinovex GmbH
 
People & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessPeople & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessinovex GmbH
 
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with PulumiInfrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with Pulumiinovex GmbH
 

Plus de inovex GmbH (20)

lldb – Debugger auf Abwegen
lldb – Debugger auf Abwegenlldb – Debugger auf Abwegen
lldb – Debugger auf Abwegen
 
Are you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AIAre you sure about that?! Uncertainty Quantification in AI
Are you sure about that?! Uncertainty Quantification in AI
 
Why natural language is next step in the AI evolution
Why natural language is next step in the AI evolutionWhy natural language is next step in the AI evolution
Why natural language is next step in the AI evolution
 
WWDC 2019 Recap
WWDC 2019 RecapWWDC 2019 Recap
WWDC 2019 Recap
 
Network Policies
Network PoliciesNetwork Policies
Network Policies
 
Interpretable Machine Learning
Interpretable Machine LearningInterpretable Machine Learning
Interpretable Machine Learning
 
Jenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen UmgebungenJenkins X – CI/CD in wolkigen Umgebungen
Jenkins X – CI/CD in wolkigen Umgebungen
 
AI auf Edge-Geraeten
AI auf Edge-GeraetenAI auf Edge-Geraeten
AI auf Edge-Geraeten
 
Prometheus on Kubernetes
Prometheus on KubernetesPrometheus on Kubernetes
Prometheus on Kubernetes
 
Deep Learning for Recommender Systems
Deep Learning for Recommender SystemsDeep Learning for Recommender Systems
Deep Learning for Recommender Systems
 
Azure IoT Edge
Azure IoT EdgeAzure IoT Edge
Azure IoT Edge
 
Representation Learning von Zeitreihen
Representation Learning von ZeitreihenRepresentation Learning von Zeitreihen
Representation Learning von Zeitreihen
 
Talk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale AssistentenTalk to me – Chatbots und digitale Assistenten
Talk to me – Chatbots und digitale Assistenten
 
Künstlich intelligent?
Künstlich intelligent?Künstlich intelligent?
Künstlich intelligent?
 
Dev + Ops = Go
Dev + Ops = GoDev + Ops = Go
Dev + Ops = Go
 
Das Android Open Source Project
Das Android Open Source ProjectDas Android Open Source Project
Das Android Open Source Project
 
Machine Learning Interpretability
Machine Learning InterpretabilityMachine Learning Interpretability
Machine Learning Interpretability
 
Performance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use casePerformance evaluation of GANs in a semisupervised OCR use case
Performance evaluation of GANs in a semisupervised OCR use case
 
People & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madnessPeople & Products – Lessons learned from the daily IT madness
People & Products – Lessons learned from the daily IT madness
 
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with PulumiInfrastructure as (real) Code – Manage your K8s resources with Pulumi
Infrastructure as (real) Code – Manage your K8s resources with Pulumi
 

MapStruct - der neue Stern am Bean-Mapping Himmel?!

  • 1.
  • 2. WER ERZÄHLT DIE NÄCHSTEN 55+ MINUTEN ETWAS? Gerrit Brehmer, Karlsruhe Auf der Arbeit: Software-Entwickler/Architekt ( / Projektleiter) bei der inovex GmbH In der Freizeit: Smart Home
  • 3. BEAN-MAPPING: EINSATZ Wann müssen Beans gemappt werden? Entities zu DTOs interne zu generierten Klassen (JAXB etc.) zur Einbindung externer Dienste standardisierten Schnittstellen eigenen REST/SOAP Schnittstellen Allgemein Austauschformate zwischen Schichten und Applikationen
  • 4. BEAN MAPPING: UMSETZUNG Was benutzen wir dafür bisher? von Hand geschriebener Mapping-Code typsicher, schnell fehleranfällig, aufwendig Dozer wenig Aufwand, Rekursives Auto-Mapping Reflection & XML: langsam Apache Commons BeanUtils wenig Aufwand Reflection, nur nicht komplexe Properties, langsam
  • 5. GEHT ES BESSER? Wunschliste schnell typsicher wenig Aufwand automatisches Mapping Null-Prüfungen Konvertierungen von "ähnlichen" Typen Fehlendes Mapping schnell erkennen nachvollziehbar
  • 6. MAPSTRUCT mapstruct.org / github.com/mapstruct OpenSource (Lizenz: Apache 2.0) Initator & Maintainer: Gunnar Morling (RedHat, Hibernate Team) Aktuelle Version: 1.0.0.CR2 (Final Release in Kürze) Weiterentwicklung/Support mehrere Stamm-Entwickler schnelles Feedback kontinuierliche Weiterentwicklung
  • 7. WIE FUNKTIONIERT MAPSTRUCT Annotation Processor Verarbeitet Annotations am eigenen Quellcode siehe andere bekannte Libs: JPA MetaModel, Lombok, QueryDSL z.B. mit Hilfe maven-processor-plugin Generiert Java Quellcode Zusammenspiel verschiedener FreeMarker Templates
  • 9. INTEGRATION IN ECLIPSE #1 MapStruct eclipse Plugin noch work-in-progress Hauptsächlich noch fehlende Features, keine Bugs Code Completion: JAXB Listen, Nested Properties Quick Fix: Collection Mappings
  • 10. INTEGRATION IN ECLIPSE #2 m2e APT Plugin Aktivierung nicht vergessen! Inkompatibilitäten mit Eclipse Compiler pre Mars (ab 1.0.0.CR2) Manchmal 'Clean Project' notwendig Maven: build-helper- maven-plugin automatische Build-Path Anpassung
  • 11. GENERIERTE ABHÄNGIGKEITEN Zu mappende Klassen sind ebenfalls generiert (z.B. JAXB per Schema) Resultat: Compiler Fehler bei Generierung MapStruct Mapper Lösung: Weiteres Maven Modul/Artefakt für abhängige Klassen Maven Plugins in unterschiedliche Phasen verlegen
  • 12. AUTOMAPPING #1 Primitive & Wrapper-Typen Datums-Typen Joda / Java 8 DateTime API Klassen Date Calendar dest.setLocalDateTime(java.time.LocalDateTime.ofInstant( src.getDate().toInstant(), java.time.ZoneId.systemDefault()) );
  • 13. AUTOMAPPING #2 Collection- & Array-Typen Mapping nicht nur per Setter Adder (ohne Null Prüfung!) Getter (ohne Null Prüfung!) Setter Mapping-Methoden zwischen Collection/Array Typen müssen nicht definiert werden Maps JAXB JAXBElement XMLGregorianCalendar
  • 14. VERSCHACHTELTE MAPPINGS @Mapping(source = "source.nested.param" target = "param") public Target toTarget(Source source); inkl. Null-Prüfungen Bisher nur für Quell-Parameter Feature Request für Ziel-Parameter vorhanden
  • 15. MAPPING VON ENUM-TYPEN @Mapping(source = "FINAL", target = "LAST") TargetEnum map(SourceEnum enum); String-Match oder explizites Mapping fehlende Mappings zu Zielwerten werden signalisiert
  • 16. MAPPING DEFAULTS UND KONSTANTEN @Mapping(source = "src", target = "dest", defaultValue = "-1") Default-Werte als Ersatz bei null-Werten in Quell- Instanzen @Mapping(constant = "CONST", target = "dest") String-Konstanten, auf die bei Bedarf Standard- Converter oder andere Mapping Methoden angewendet werden
  • 17. QUALIFIER Unterscheidung bei identischem Quell- und Zieltyp Ohne Qualifier Zuordnung nicht eindeutig = Compiler Fehler spezielle Mappings für ansonsten automatisch generierten Mapping- Code @Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Marker { } @Marker public String specialStringMapping(String source) { ... } @Mapping(source = "src", target = "dest", qualifiedBy = Marker.class) public Target map(Source source);
  • 18. BEAN-FACTORIES Als Ersatz für Standard-Konstruktor Selbst geschriebene Factory-Methoden (leere Parameterliste, Rückgabetyp = Zieltyp) Generische Factories möglich Verwendung bereits vorhandener (z.B. ObjectFactory von JAXB) @Mapper(uses = CustomFactory.class) public interface Mapper { ... } public class CustomFactory { public TargetDto createTargetDto() { .... } public <T extends AbstractEntity> T createEntity(@TargetType Class<T> entityClass) { ... } }
  • 19. MAPPING PER EXPRESSION @Mapping( expression = "java(java.util.UUID.randomUUID().toString())", target = "uniqueId") TargetDto mapTo(SourceEntity source); Aktuell nur Unterstützung für Java Code echte Skriptsprachen für zukünftige Versionen geplant Notwendige Imports können am @Mapper konfiguriert werden
  • 20. UNTERSCHIEDLICHE QUELLEN @Mappings({ @Mapping(source = "param1.src", target = "dest1"), @Mapping(source = "param2.src", target = "dest2") }) Target map(SourceOne param1, SourceTwo param2); Aber: Sind nur im Custom-Code / Expressions wiedervendbar
  • 21. MAPPING ALS UPDATE @Mapper public interface Mapper { Target update(Source src, @MappingTarget Target target); } mehrere Quellen möglich Return Type: voidoder identisch mit Ziel-Typ
  • 22. BIDIREKTIONALES MAPPING @Mapper public interface Mapper { @Mapping(source = "special", target = "destParam") Dto map(Entity source); @InheritInverseConfiguration Entity map(Dto source); } Ausnahmen geschachtelte Quell-Property Konstanten Expressions
  • 23. CUSTOM MAPPER #1 @Mapper(uses = CustomMapper.class) public interface Mapper { ... } public class CustomMapper { public TargetDto toTarget(Source source) { .... } } Mapper Klassen notwendig, wenn automatische Mapping-Methoden nicht generiert werden können Einzelnes Element gemappt auf Liste Liste mit Inhalten aus verschiedenen Quellen Liste komplexer Elemente gemappt auf Liste primitiver Werte
  • 24. CUSTOM MAPPER #2 @Mapper(uses = CustomMapper.class) public interface Mapper { ... } @Mapper public abstract class CustomMapper { public TargetDto toTarget(Source source) { .... } @Mappings(...) public abstract NestingTargetDto toNestingTarget(NestingSource source); } Abstrakte Klassen Ähnlich wie Mapper per Interface abstrakte Methoden werden generiert public Methoden enthalten den nicht generierbaren Mapper-Code
  • 25. KOMPONENTENMODELLE Konfiguration pro Mapper Mehrere werden bereits unterstützt Spring (@Component, @Autowired) CDI (@ApplicationScoped, @Inject) JSR 330 (@Named, @Inject) Alle miteinander verbundenen Mapper müssen dasselbe Komponentenmodell verwenden Keine Abhängigkeit zu MapStruct zur Laufzeit @Mapper(componentModel = "spring") public interface Mapper { ... } @Component public class MapperImpl { ... }
  • 26. KONFIGURATION @MapperConfig(componentModel = ..., uses = ..., ...) public interface DefaultMapperConfig { ... } @Mapper(config = "DefaultMapperConfig") public interface Mapper { ... }
  • 27. MAPPING ASPEKTE #1 Decorator angepasster Code für ausgewählte Methoden Aber: greift nur, wenn Methode vom eigenen Code oder anderen Mapper-Klassen aufgerufen wird @Mapper @DecoratedWith(MapperDecorator.class) public interface Mapper { ... } public abstract class MapperDecorator implements Mapper { private final Mapper delegate; public MapperDecorator(Mapper delegate) { this.delegate = delegate; } @Override public Target toTarget(Source source) { Target target = delegate.toTarget(source); // ... custom mapping ... }
  • 28. MAPPING ASPEKTE #2 @BeforeMappingund @AfterMapping Matching auf Mapping-Methoden anhand Quell- und Zieltypen @Mapper public abstract class Mapper { @BeforeMapping void flushEntity(AbstractEntity entity) { // flush entity to init all fields } @AfterMapping void manuelUpdateMissing(Source src, @MappingTarget Target target) { // e.g. as alternative for expressions / custom mapper } }
  • 29. EXCEPTIONHANDLING Checked Exceptions nur wenn an Mapping Methode deklariert ansonsten gewrapped in RuntimeException RuntimeExceptions ohne Anpassung
  • 30. FAZIT & AUSBLICK MapStruct ist ready-to-use umfangreiche Dokumentation lebendige Community keine Bugs, die den Einsatz verhndern Große Funktionsauswahl: Viele Wege führen zum Ziel! So viel wie möglich automatisch mappen Damit verbundene Checks durch MapStruct minimieren Mapping Fehler Das Feature-Set ist noch nicht komplett: Weitere nützliche Features werden sicher folgen!
  • 31. VIELEN DANK FÜR EURE AUFMERKSAMKEIT!