Früher habe ich eine Bibliothek namens Dozer für die Entwicklung mit Spring Framework verwendet. Da es sich jedoch um eine praktische Bibliothek handelt, habe ich mich für die Verwendung mit dem derzeit verwendeten Play Framework entschieden und den Code geschrieben. Die erstellte Quelle wird auf GitHub hochgeladen.
Eine Bibliothek, die Daten zwischen Objekten abbildet. Dies ist sehr nützlich, wenn Daten mit dem MVC-Framework zwischen Ebenen übertragen werden. Schauen wir uns zunächst eine normale Implementierung an, die Dozer nicht verwendet. Wenn Sie Daten von der aktuellen Ebene zur nächsten Ebene übergeben, schreiben Sie häufig Code wie den folgenden.
Normale Zuordnung
//Aktuelle Schicht
//Übergeben Sie Daten an die nächste Layer-Bean
BeanB beanB = new BeanB();
beanB.field1 = beanA.field1;
beanB.field2 = beanA.field2;
beanB.field3 = beanA.field3;
.
.
.
//Verarbeitung der nächsten Schicht
service.run(beanB);
Das Obige ist ein einfaches Muster, aber wenn die Bean einen Setter oder Getter implementiert oder wenn der Typ konvertiert wird, weil sich der Typ zwischen den Beans unterscheidet, ist die Lesbarkeit schlecht und je mehr Parameter vorhanden sind, desto redundanter ist der Code Es wird sein. Wenn die Bean die Parameter erhöht oder verringert, muss die Zuordnung jedes Mal geändert werden. Das folgende Beispiel zeigt Dozer.
Dozer-Mapping
//Aktuelle Schicht
//Bean Mapping von Dozer
Mapper mapper = new DozerBeanMapper();
BeanB beanB = mapper.map(beanA, BeanB.class);
//Verarbeitung der nächsten Schicht
service.run(beanB);
Wenn Sie das Kopierquellobjekt im ersten Argument der Map-Methode und die Kopierzielklasse im zweiten Argument übergeben, wird das Kopierzielklassenobjekt zurückgegeben, das die Kopierquelldaten enthält. Dies liegt daran, dass Dozer die Daten der Kopierquelle dem gleichnamigen Parameter des Kopierziels zuordnet. Wenn der Typ die Typkonvertierung unterstützt, wird die Typkonvertierung automatisch durchgeführt. Weitere Informationen zur Unterstützung der Typkonvertierung finden Sie unter hier.
Versuchen wir es mit Dozer. Ich habe eine App erstellt, die nur den Namen und die Menge vom Bildschirm eingibt und registriert, daher möchte ich Dozer dort vorstellen. Die Installation ist nicht besonders schwierig, da sie einfach durch Hinzufügen zu build.sbt verwendet werden kann.
Fügen Sie zunächst build.sbt Folgendes hinzu und laden Sie es neu und aktualisieren Sie es.
libraryDependencies += "net.sf.dozer" % "dozer" % "5.5.1"
Danach können Sie DozerBeanMapper in der Ebene generieren, die Dozer verwendet, und es verwenden, aber dieses Mal möchte ich es in DI definieren. Erstellen Sie eine MappingModule-Klasse, die AbstractModule erbt, und definieren Sie die Abhängigkeiten.
MappingModule
//Import weggelassen
public class MappingModule extends AbstractModule {
@Override
protected void configure() {
bind(Mapper.class).to(DozerBeanMapper.class);
}
}
Registrieren Sie das erstellte MappingModule in der application.conf.
application.conf
play.modules {
enabled += modules.MappingModule
}
Die in jeder Schicht verwendeten Bohnen sind wie folgt definiert.
Bohne | Schicht |
---|---|
Form | Client - Controller |
Dto | Controller - Service |
Model | Service - Repository |
Injizieren Sie Mapper in die Klasse, die Sie Dozer verwenden möchten. Da das Folgende die Controller-Klasse ist, ordnen wir Daten von Form zu Dto zu.
IndexController
package controllers;
//Import weggelassen
public class IndexController extends Controller {
@Inject
private FormFactory formFactory;
@Inject
private Mapper mapper; //Dies
@Inject
private IndexService service;
//Andere Methoden wurden weggelassen
public Result post() {
Form<IndexForm> f = formFactory.form(IndexForm.class).bindFromRequest();
IndexDto dto = mapper.map(f.get(), IndexDto.class); //Mapping hier
switch(f.get().action){
case "regist":
service.regist(dto);
break;
case "delete":
service.delete(dto);
break;
default:
}
return ok(views.html.index.render(f, dto));
}
}
Nach dem Erstellen eines RequestBind to Form werden die Daten Dto zugeordnet und die Verarbeitung in die nächste Ebene (Service) verschoben. Form und Dto sind wie folgt definiert.
IndexForm
package forms;
public class IndexForm {
/**Bildschirmaktion*/
public String action;
/**Name*/
public String name;
/**Geldbetrag*/
public String amount;
/**ID löschen*/
public String id;
}
IndexDto
package dtos;
//Import weggelassen
public class IndexDto {
/**Name*/
public String name;
/**Geldbetrag*/
public BigDecimal amount;
/**ID löschen*/
public Long id;
/**Datenliste*/
public List<Person> personList;
}
Der Typ des Betrags und die Lösch-ID sind unterschiedlich, die Typkonvertierung erfolgt jedoch in Mapper.
Da der Server tatsächlich gestartet und der Vorgang bestätigt wurde, wird die Quelle auf GitHub hochgeladen. Dozer kann angepasst werden, um die Zuordnung zwischen Feldern mit unterschiedlichen Namen und komplexe Zuordnungen zu ermöglichen, aber ich konnte nicht schreiben, da ich nicht wusste, wie ich es in Play einstellen soll. Ich möchte es untersuchen und aktualisieren.
Recommended Posts