Was ist MapStruct und warum wird es benötigt?
MapStruct ist ein Code-Generator für Java, der automatisch Implementierungen von Mappern (Konvertern) zwischen Objekten unterschiedlicher Typen erstellt. In der modernen Java-Entwicklung müssen Objekte häufig konvertiert werden: Entity in DTO, DTO in VO, eine API-Antwort in ein anderes Modell und so weiter. Das manuelle Schreiben solchen Codes ist mühsam, zeitaufwendig und fehleranfällig. MapStruct löst dieses Problem, indem es den gesamten Boilerplate-Code zur Kompilierzeit generiert.
Die wichtigsten Vorteile von MapStruct:
- Leistung: Code-Generierung zur Kompilierzeit (Compile-Time). Keine Reflektion, keine Performance-Einbußen zur Laufzeit. MapStruct arbeitet genauso schnell, als ob Sie das Mapping manuell geschrieben hätten.
- Typsicherheit: Alle Fehler (Typenkonflikte, fehlende Felder) werden zur Kompilierzeit erkannt, nicht erst zur Laufzeit.
- Einfachheit: Minimale Konfiguration. Sie definieren lediglich ein Interface oder eine abstrakte Klasse mit Mapping-Methoden, und MapStruct generiert die Implementierung automatisch.
- Flexibilität: Unterstützung für komplexe Mappings, Typkonvertierungen, die Verwendung von Ausdrücken, Methodenaufrufe und die Integration mit anderen Bibliotheken (Lombok, Spring usw.).
- Sauberer Code: Der Mapping-Code ist von der Geschäftslogik getrennt, was ihn lesbarer und wartbarer macht.
MapStruct ist besonders nützlich in mehrschichtigen Architekturen (Controller-Service-Repository), in denen Objekte häufig zwischen den Schichten konvertiert werden müssen.
Installation von MapStruct
MapStruct wird nicht über pip oder npm installiert, da es sich um eine Java-Bibliothek handelt. Um MapStruct in Ihr Projekt einzubinden, verwenden Sie das Build-System Maven oder Gradle.
Installation mit Maven
Fügen Sie die folgenden Abhängigkeiten in Ihre pom.xml-Datei ein:
<dependencies>
<!-- Hauptbibliothek MapStruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
<!-- Annotation Processor (für die Code-Generierung) -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
Installation mit Gradle
Für Gradle fügen Sie in Ihre build.gradle-Datei ein:
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
}
Wichtig: Stellen Sie sicher, dass die Version von mapstruct-processor mit der Version von mapstruct übereinstimmt. Nach dem Hinzufügen der Abhängigkeiten führen Sie einen Build Ihres Projekts durch (z. B. mvn clean compile), damit MapStruct die Mapper-Implementierungen generiert.
Schnellstart mit einem Codebeispiel
Lassen Sie uns einen einfachen Mapper erstellen, der ein Car-Objekt (Entity) in ein CarDto-Objekt (DTO) konvertiert.
Schritt 1: Definieren Sie die Quell- und Zielklassen
// Car.java
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
// Konstruktoren, Getter, Setter
public Car() {}
public Car(String make, int numberOfSeats, CarType type) {
this.make = make;
this.numberOfSeats = numberOfSeats;
this.type = type;
}
public String getMake() { return make; }
public void setMake(String make) { this.make = make; }
public int getNumberOfSeats() { return numberOfSeats; }
public void setNumberOfSeats(int numberOfSeats) { this.numberOfSeats = numberOfSeats; }
public CarTy