Ich sehe oft Geschichten wie "ModelMapper", dass "Mapping-Bibliotheken, die Reflektion für" Java "verwenden, nicht für die" Datenklasse "von" Kotlin "funktionieren. Warum ist das so und um damit umzugehen? Schreiben Sie, welche Mittel Sie haben.
TL;DR
In diesem Artikel verwenden wir den Begriff Mapping-Bibliothek, um Folgendes zu bedeuten:
ModelMapper
, BeanPropertyRowMapper
Auch das Kartenziel auf "Kotlin" spielt keine Rolle, ob es sich um "Klasse" oder "Datenklasse" handelt. Da es sich jedoch häufig um "Datenklasse" handelt, wird in diesem Artikel "Datenklasse" angenommen. Behandeln wie.
Um zu bestätigen, dass "Datenklasse keinen argumentlosen Konstruktor hat", dekompilieren Sie die folgende Klasse mit der Funktion "Idee".
data class Sample(val foo: Int, val bar: Int?)
Das Ergebnis ist wie folgt. Sie können sehen, dass es keine Definition eines Konstruktors ohne Argumente gibt.
Dekompilierungsergebnis (* Teile, die nicht mit dem Inhalt des Artikels zusammenhängen, wurden weggelassen)
/*Abkürzung*/
public final class Sample {
private final int foo;
@Nullable
private final Integer bar;
public final int getFoo() {
return this.foo;
}
@Nullable
public final Integer getBar() {
return this.bar;
}
public Sample(int foo, @Nullable Integer bar) {
this.foo = foo;
this.bar = bar;
}
/*Abkürzung*/
Wie bisher erläutert, funktioniert die reflexionsbasierte Mapping-Bibliothek für "Java" nicht für die "Datenklasse" von "Kotlin". Es gibt jedoch mehrere Möglichkeiten, dies zu erzwingen.
Die Kotlin-Formel bietet ein Plug-In, das einen argumentlosen Konstruktor hinzufügt, der nur zur Laufzeit aufgerufen werden kann. Auf diese Weise wird die Nullsicherheit verletzt, aber die traditionelle Bibliothek scheint zu funktionieren.
Wenn Sie die zugeordnete Klasse so schreiben, dass sie wie "POJO" von "Java" funktioniert, funktioniert die herkömmliche Bibliothek. Durch Trennen der Schnittstelle, die nach außen zeigt, und der Implementierung der Klasse, in der die tatsächlichen Daten gespeichert sind, kann eine Situation realisiert werden, die "von außen wie eine normale" Datenklasse "aussieht".
Wenn Sie die vollständige Kotlin-Konvertierung aufgeben möchten, können Sie sie mit POJO implementieren und dem Getter eine Anmerkung hinzufügen, die Nullability darstellt.
Schließlich werde ich, soweit ich weiß, über die Mapping-Bibliothek "Object to Object" schreiben, die "Kotlin" unterstützt.
KMapper Dies ist eine auf Funktionsaufrufen basierende Mapping-Bibliothek, die vom Autor basierend auf der Reflexion von "Kotlin" erstellt wurde. Zusätzlich zu "Objekt" können Sie "Karte" usw. als Argument verwenden oder eine Zuordnung aus mehreren Argumenten durchführen.
Funktionsaufrufe durch Reflektion von "Kotlin" können relativ einfach implementiert werden, so dass ich der Meinung bin, dass es einfach ist, schnell eigene zu erstellen, wenn Sie keine Funktionalität benötigen.
MapStruct Obwohl es sich zum Zeitpunkt des Schreibens in der Beta-Phase befindet, scheint "MapStruct" das Mapping zu unterstützen, indem der Konstruktor von "1.4" aufgerufen wird.
Als Ergänzung werde ich die Details weglassen, aber ich denke, dass es einfach ist, "Kotlin" zu unterstützen, selbst wenn es für "Java" ist, wenn es sich um eine Bibliothek handelt, die auf "Annotation-Processor" basiert.
Jackson Da "Jackson" Kotlin-Unterstützung hat, kann das Mapping durch das Verfahren "einmal in JSON konvertieren -> deserialisieren" erreicht werden. Es hat viele Funktionen und kann für verschiedene Quellen verwendet werden, solange es serialisiert werden kann. Daher kann es überraschend gut sein, "Jackson" mit Ausnahme der Ausführungsgeschwindigkeit zu verwenden.
Recommended Posts